// 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}}
}