1 //  { dg-do run }
2 
3 #include "../coro.h"
4 
5 struct pt_b
6 {
final_suspendpt_b7     std::suspend_never final_suspend() const noexcept { return {}; }
return_voidpt_b8     constexpr void return_void () noexcept {};
unhandled_exceptionpt_b9     void unhandled_exception() const noexcept {}
10 };
11 
12 int called_is_op = 0;
13 struct is
14 {
operatoris15     std::suspend_never operator ()() noexcept {
16         PRINT("call to operator IS");
17         called_is_op++;
18         return {};
19     }
20 };
21 
22 struct pt_c : pt_b
23 {
24     using handle_t = std::coroutine_handle<pt_c>;
get_return_objectpt_c25     auto get_return_object() noexcept { return handle_t::from_promise(*this); }
26     is initial_suspend;
27 };
28 
29 int called_lambda = 0;
30 struct pt_d : pt_b
31 {
32     using handle_t = std::coroutine_handle<pt_d>;
get_return_objectpt_d33     auto get_return_object() noexcept { return handle_t::from_promise(*this); }
34     static constexpr auto initial_suspend
35       = []() noexcept {
36 	   PRINT("call to lambda IS");
37 	   called_lambda++;
38 	   return std::suspend_never{};
39 	  };
40 };
41 
42 template <>
43 struct std::coroutine_traits<pt_c::handle_t>
44 { using promise_type = pt_c; };
45 
46 static pt_c::handle_t foo ()
47 {
48     co_return;
49 }
50 
51 template <>
52 struct std::coroutine_traits<pt_d::handle_t>
53 { using promise_type = pt_d; };
54 
55 static pt_d::handle_t bar ()
56 {
57     co_return;
58 }
59 
60 int main ()
61 {
62     foo ();
63     bar ();
64     if (called_is_op != 1 || called_lambda != 1)
65       {
66         PRINT ("Failed to call one of the initial_suspend cases");
67         abort ();
68       }
69 }
70