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