annotate gcc/testsuite/g++.dg/coroutines/torture/co-await-17-capture-comp-ref.C @ 152:2b5abeee2509

update gcc11
author anatofuz
date Mon, 25 May 2020 07:50:57 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
152
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1 // { dg-do run { target c++17 } }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
3 #include "../coro.h"
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
4
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
5 class resumable {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
6 public:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
7 struct promise_type;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
8 using coro_handle = std::coroutine_handle<promise_type>;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
9 resumable(coro_handle handle) : handle_(handle) { }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
10 resumable(resumable&) = delete;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
11 resumable(resumable&&) = delete;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
12 ~resumable() { handle_.destroy(); }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
13 coro_handle handle_;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
14 };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
15
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
16 struct resumable::promise_type {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
17 using coro_handle = std::coroutine_handle<promise_type>;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
18 int used;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
19 auto get_return_object() {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
20 return coro_handle::from_promise(*this);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
21 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
22 auto initial_suspend() { return std::suspend_never(); }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
23 auto final_suspend() { return std::suspend_always(); }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
24 void return_value(int x) {used = x;}
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
25 void unhandled_exception() {}
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
26
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
27 struct TestAwaiter {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
28 int recent_test;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
29 TestAwaiter(int test) : recent_test{test} {}
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
30 bool await_ready() { return false; }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
31 void await_suspend(std::coroutine_handle<promise_type>) {}
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
32 int await_resume() {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
33 return recent_test;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
34 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
35 auto operator co_await() {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
36 return *this;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
37 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
38 };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
39
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
40 struct TestAwaiterCH :TestAwaiter {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
41 TestAwaiterCH(int test) : TestAwaiter(test) {};
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
42 };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
43
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
44 struct TestAwaiterCHCH :TestAwaiterCH {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
45 TestAwaiterCHCH(int test) : TestAwaiterCH(test) {};
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
46
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
47 resumable foo(){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
48 int x = co_await *this;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
49 co_return x;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
50 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
51 };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
52 };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
53
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
54 struct TestP {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
55 resumable::promise_type::TestAwaiterCHCH tp = resumable::promise_type::TestAwaiterCHCH(6);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
56 };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
57
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
58 resumable foo1(int t){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
59 int x = co_await resumable::promise_type::TestAwaiterCH(t);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
60 co_return x;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
61 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
62
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
63 resumable foo2(){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
64 struct TestP TP;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
65 int x = co_await TP.tp;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
66 co_return x;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
67 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
68
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
69 resumable foo3(){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
70 int x = co_await TestP{}.tp;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
71 co_return x;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
72 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
73
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
74 int main(){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
75 auto t = resumable::promise_type::TestAwaiterCHCH(4);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
76 resumable res = t.foo();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
77 while (!res.handle_.done())
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
78 res.handle_.resume();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
79 if (res.handle_.promise().used != 4)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
80 abort();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
81
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
82 resumable res1 = foo1(5);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
83 while (!res1.handle_.done())
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
84 res1.handle_.resume();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
85 if (res1.handle_.promise().used != 5)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
86 abort();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
87
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
88 resumable res2 = foo2();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
89 while (!res2.handle_.done())
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
90 res2.handle_.resume();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
91 if (res2.handle_.promise().used != 6)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
92 abort();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
93
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
94 resumable res3 = foo2();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
95 while (!res3.handle_.done())
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
96 res3.handle_.resume();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
97 if (res3.handle_.promise().used != 6)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
98 abort();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
99 }