Skip to content

Commit baa508d

Browse files
committed
C++: Add some simple coroutine tests.
1 parent 11acb49 commit baa508d

File tree

1 file changed

+115
-0
lines changed

1 file changed

+115
-0
lines changed
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
namespace std {
2+
3+
template<class R, class... Args>
4+
struct coroutine_traits{
5+
using promise_type = R::promise_type;
6+
};
7+
8+
using nullptr_t = decltype(nullptr);
9+
10+
template<typename Promise>
11+
struct coroutine_handle {
12+
constexpr coroutine_handle() noexcept;
13+
constexpr coroutine_handle( std::nullptr_t ) noexcept;
14+
coroutine_handle(const coroutine_handle&) noexcept;
15+
coroutine_handle(coroutine_handle&&) noexcept;
16+
17+
static coroutine_handle from_promise(Promise&);
18+
coroutine_handle& operator=(nullptr_t) noexcept;
19+
coroutine_handle& operator=(const coroutine_handle&) noexcept;
20+
coroutine_handle& operator=(coroutine_handle&&) noexcept;
21+
constexpr operator coroutine_handle() const noexcept;
22+
23+
bool done() const;
24+
constexpr explicit operator bool() const noexcept;
25+
26+
void operator()() const;
27+
void resume() const;
28+
29+
void destroy() const;
30+
31+
Promise& promise() const;
32+
33+
constexpr void* address() const noexcept;
34+
static constexpr coroutine_handle from_address(void *);
35+
};
36+
37+
template<typename Promise>
38+
constexpr bool operator==(coroutine_handle<Promise>, coroutine_handle<Promise>) noexcept;
39+
40+
struct suspend_always {
41+
constexpr bool await_ready() const noexcept;
42+
template<typename Promise> constexpr void await_suspend(coroutine_handle<Promise>) const noexcept;
43+
constexpr void await_resume() const noexcept;
44+
};
45+
}
46+
47+
class co_returnable_void {
48+
public:
49+
struct promise_type;
50+
co_returnable_void(std::coroutine_handle<promise_type>);
51+
52+
co_returnable_void(co_returnable_void&) = delete;
53+
co_returnable_void(co_returnable_void&&) = delete;
54+
};
55+
56+
struct co_returnable_void::promise_type {
57+
std::coroutine_handle<promise_type> get_return_object();
58+
std::suspend_always initial_suspend() noexcept;
59+
std::suspend_always final_suspend() noexcept;
60+
61+
void return_void();
62+
void unhandled_exception();
63+
64+
std::suspend_always yield_value(int);
65+
};
66+
67+
class co_returnable_value {
68+
public:
69+
struct promise_type;
70+
co_returnable_value(std::coroutine_handle<promise_type>);
71+
72+
co_returnable_value(co_returnable_value&) = delete;
73+
co_returnable_value(co_returnable_value&&) = delete;
74+
};
75+
76+
struct co_returnable_value::promise_type {
77+
std::coroutine_handle<promise_type> get_return_object();
78+
std::suspend_always initial_suspend() noexcept;
79+
std::suspend_always final_suspend() noexcept;
80+
81+
void return_value(int);
82+
void unhandled_exception();
83+
84+
std::suspend_always yield_value(int);
85+
};
86+
87+
co_returnable_void co_return_void() {
88+
co_return;
89+
}
90+
91+
co_returnable_value co_return_int(int i) {
92+
co_return i;
93+
}
94+
95+
co_returnable_void co_yield_value_void(int i) {
96+
co_yield i;
97+
}
98+
99+
co_returnable_value co_yield_value_value(int i) {
100+
co_yield i;
101+
}
102+
103+
co_returnable_void co_yield_and_return_void(int i) {
104+
co_yield i;
105+
co_return;
106+
}
107+
108+
co_returnable_value co_yield_and_return_value(int i) {
109+
co_yield i;
110+
co_return (i + 1);
111+
}
112+
113+
114+
115+
// semmle-extractor-options: --edg --c++20

0 commit comments

Comments
 (0)