|  | // RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -std=c++20 -fsyntax-only -verify -Wunreachable-code | 
|  |  | 
|  | #include "Inputs/std-coroutine.h" | 
|  |  | 
|  | extern void abort(void) __attribute__((__noreturn__)); | 
|  |  | 
|  | struct task { | 
|  | struct promise_type { | 
|  | std::suspend_always initial_suspend(); | 
|  | std::suspend_always final_suspend() noexcept; | 
|  | void return_void(); | 
|  | std::suspend_always yield_value(int) { return {}; } | 
|  | task get_return_object(); | 
|  | void unhandled_exception(); | 
|  |  | 
|  | struct Awaiter { | 
|  | bool await_ready(); | 
|  | void await_suspend(auto); | 
|  | int await_resume(); | 
|  | }; | 
|  | auto await_transform(const int& x) { return Awaiter{}; } | 
|  | }; | 
|  | }; | 
|  |  | 
|  | task test1() { | 
|  | abort(); | 
|  | co_yield 1; | 
|  | } | 
|  |  | 
|  | task test2() { | 
|  | abort(); | 
|  | 1;  // expected-warning {{code will never be executed}} | 
|  | co_yield 1; | 
|  | } | 
|  |  | 
|  | task test3() { | 
|  | abort(); | 
|  | co_return; | 
|  | } | 
|  |  | 
|  | task test4() { | 
|  | abort(); | 
|  | 1;  // expected-warning {{code will never be executed}} | 
|  | co_return; | 
|  | } | 
|  |  | 
|  | task test5() { | 
|  | abort(); | 
|  | co_await 1; | 
|  | } | 
|  |  | 
|  | task test6() { | 
|  | abort(); | 
|  | 1;  // expected-warning {{code will never be executed}} | 
|  | co_await 3; | 
|  | } | 
|  |  | 
|  | task test7() { | 
|  | // coroutine statements are not considered unreachable. | 
|  | co_await 1; | 
|  | abort(); | 
|  | co_await 2; | 
|  | } | 
|  |  | 
|  | task test8() { | 
|  | // coroutine statements are not considered unreachable. | 
|  | abort(); | 
|  | co_return; | 
|  | 1 + 1;  // expected-warning {{code will never be executed}} | 
|  | } | 
|  |  | 
|  | task test9() { | 
|  | abort(); | 
|  | // This warning is emitted on the declaration itself, rather the coroutine substmt. | 
|  | int x = co_await 1; // expected-warning {{code will never be executed}} | 
|  | } |