Files
clang-p2996/clang/test/SemaCXX/coroutine-unreachable-warning.cpp
Haojian Wu a73baf620b [coroutine] Suppress unreachable-code warning on coroutine statements. (#77454)
This fixes #69219.

Consider an example:

```
CoTask my_coroutine() {
    std::abort();
    co_return 1; // unreachable code warning.
}
```

Clang emits a CFG-based unreachable warning on the `co_return` statement
(precisely the `1` subexpr). If we remove this statement, the program
semantic is changed (my_coroutine is not a coroutine anymore).

This patch fixes this issue by never considering coroutine statements as
dead statements.
2024-02-05 08:55:27 +01:00

77 lines
1.5 KiB
C++

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