Mercurial > hg > CbC > CbC_gcc
comparison gcc/testsuite/g++.dg/coroutines/coro1-allocators.h @ 145:1830386684a0
gcc-9.2.0
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 11:34:05 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
131:84e7813d76e9 | 145:1830386684a0 |
---|---|
1 /* Include <coroutine> or the equivalent. */ | |
2 #include "coro.h" | |
3 | |
4 /* Allow for stand-alone testing with no headers installed. */ | |
5 #if __has_include(<new>) | |
6 # include <new> | |
7 #else | |
8 | |
9 /* Required when get_return_object_on_allocation_failure() is defined by | |
10 the promise. We need a no-throw new, and new etc. build the relevant | |
11 pieces here to avoid needing the headers in the test. */ | |
12 | |
13 namespace std { | |
14 struct nothrow_t {}; | |
15 constexpr nothrow_t nothrow = {}; | |
16 typedef __SIZE_TYPE__ size_t; | |
17 } // end namespace std | |
18 | |
19 void* operator new(std::size_t, const std::nothrow_t&) noexcept; | |
20 void operator delete(void* __p, const std::nothrow_t&) noexcept; | |
21 | |
22 #endif | |
23 | |
24 /* Flags and counters so that we can test that the methods we expected | |
25 to be called, were called (and the correct number of times). */ | |
26 | |
27 #ifdef USE_FAILING_OP_NEW | |
28 extern int used_failing_new; | |
29 #endif | |
30 | |
31 #if defined (PROVIDE_NEW_SZT) || defined (PROVIDE_NEW_SZT_INT) | |
32 extern int used_ovl_new; | |
33 #endif | |
34 | |
35 #ifdef PROVIDE_NEW_SZT_NT | |
36 extern void *malloc (size_t); | |
37 extern int used_ovl_new_nt; | |
38 #endif | |
39 | |
40 #ifdef PROVIDE_DEL_VP | |
41 extern int used_ovl_del; | |
42 #endif | |
43 | |
44 #ifdef PROVIDE_DEL_VP_SZT | |
45 extern int used_ovl_del_2arg; | |
46 #endif | |
47 | |
48 #ifdef PROVIDE_GROOAF | |
49 extern int used_grooaf; | |
50 #endif | |
51 | |
52 struct coro1 { | |
53 struct promise_type; | |
54 using handle_type = coro::coroutine_handle<coro1::promise_type>; | |
55 handle_type handle; | |
56 coro1 () noexcept : handle(0) {} | |
57 coro1 (handle_type _handle) noexcept | |
58 : handle(_handle) { | |
59 PRINT("Created coro1 object from handle"); | |
60 } | |
61 coro1 (const coro1 &) = delete; // no copying | |
62 coro1 (coro1 &&s) noexcept : handle(s.handle) { | |
63 s.handle = nullptr; | |
64 PRINT("coro1 mv ctor "); | |
65 } | |
66 coro1 &operator = (coro1 &&s) noexcept { | |
67 handle = s.handle; | |
68 s.handle = nullptr; | |
69 PRINT("coro1 op= "); | |
70 return *this; | |
71 } | |
72 ~coro1() noexcept { | |
73 PRINT("Destroyed coro1"); | |
74 if ( handle ) | |
75 handle.destroy(); | |
76 } | |
77 | |
78 struct suspend_never_prt { | |
79 bool await_ready() const noexcept { return true; } | |
80 void await_suspend(handle_type) const noexcept { PRINT ("susp-never-susp");} | |
81 void await_resume() const noexcept { PRINT ("susp-never-resume");} | |
82 ~suspend_never_prt() {}; | |
83 }; | |
84 | |
85 struct suspend_always_prt { | |
86 bool await_ready() const noexcept { return false; } | |
87 void await_suspend(handle_type) const noexcept { PRINT ("susp-always-susp");} | |
88 void await_resume() const noexcept { PRINT ("susp-always-resume");} | |
89 }; | |
90 | |
91 struct promise_type { | |
92 promise_type() { PRINT ("Created Promise"); } | |
93 ~promise_type() { PRINT ("Destroyed Promise"); } | |
94 | |
95 auto get_return_object () { | |
96 PRINT ("get_return_object: handle from promise"); | |
97 return handle_type::from_promise (*this); | |
98 } | |
99 auto initial_suspend () { | |
100 PRINT ("get initial_suspend (always)"); | |
101 return suspend_always_prt{}; | |
102 } | |
103 auto final_suspend () { | |
104 PRINT ("get final_suspend (always)"); | |
105 return suspend_always_prt{}; | |
106 } | |
107 void return_void () { | |
108 PRINT ("return_void ()"); | |
109 } | |
110 void unhandled_exception() { PRINT ("** unhandled exception"); } | |
111 | |
112 #ifdef USE_FAILING_OP_NEW | |
113 /* Provide an operator, that always fails. */ | |
114 void *operator new (std::size_t sz) noexcept { | |
115 PRINT ("promise_type: used failing op new"); | |
116 used_failing_new++; | |
117 return nullptr; | |
118 } | |
119 #endif | |
120 | |
121 #ifdef PROVIDE_NEW_SZT | |
122 void *operator new (std::size_t sz) { | |
123 PRINT ("promise_type: used overloaded operator new"); | |
124 used_ovl_new++; | |
125 return ::operator new(sz); | |
126 } | |
127 #endif | |
128 | |
129 #ifdef PROVIDE_NEW_SZT_NT | |
130 void *operator new (std::size_t sz, const std::nothrow_t&) noexcept { | |
131 PRINT ("promise_type: used overloaded operator new NT"); | |
132 return malloc (sz); | |
133 } | |
134 #endif | |
135 | |
136 #ifdef PROVIDE_NEW_SZT_INT | |
137 void *operator new (std::size_t sz, int x) { | |
138 PRINT ("promise_type: used overloaded operator new with int arg"); | |
139 used_ovl_new += x; | |
140 return ::operator new(sz); | |
141 } | |
142 #endif | |
143 | |
144 #ifdef PROVIDE_DEL_VP | |
145 void operator delete (void *p) { | |
146 PRINT ("promise_type: used overloaded operator delete 1 arg"); | |
147 used_ovl_del++; | |
148 return ::operator delete(p); | |
149 } | |
150 #endif | |
151 | |
152 #ifdef PROVIDE_DEL_VP_SZT | |
153 void operator delete (void *p, std::size_t sz) { | |
154 PRINT ("promise_type: used overloaded operator delete 2 args"); | |
155 used_ovl_del_2arg++; | |
156 return ::operator delete(p); | |
157 } | |
158 #endif | |
159 | |
160 #ifdef BOGUS_OPNEW_CASE1 | |
161 /* Provide an operator, but it doesn't match on overload. */ | |
162 void *operator new (std::size_t sz, char *f) noexcept { | |
163 PRINT ("promise_type: used bogus op new"); | |
164 return nullptr; | |
165 } | |
166 #endif | |
167 | |
168 #ifdef BOGUS_OPDEL_CASE1 | |
169 /* Provide an operator, but it doesn't match on overload. */ | |
170 void operator delete (void *p, char *f) { | |
171 PRINT ("promise_type: used bogus overloaded operator delete"); | |
172 } | |
173 #endif | |
174 | |
175 #ifdef PROVIDE_GROOAF | |
176 static coro1 get_return_object_on_allocation_failure () noexcept { | |
177 PRINT ("alloc fail return"); | |
178 used_grooaf++; | |
179 return coro1 (nullptr); | |
180 } | |
181 #endif | |
182 | |
183 }; // promise | |
184 }; // coro1 |