unevaluated context Closes https://github.com/llvm/llvm-project/issues/58133 The direct cause for this issue is that the compilation process continues after it found it is in a invalid state. [expr.await]p2 says clearly that the co_await expressions are not allowed to appear in unevaluated context. So we can exit early in this case. It also reduces many redundant diagnostic messages (Such as 'expression with side effects has no effect in an unevaluated context').
38 lines
1.1 KiB
C++
38 lines
1.1 KiB
C++
// RUN: %clang_cc1 -triple x86_64-apple-darwin9 %s -std=c++20 -fsyntax-only -Wignored-qualifiers -Wno-error=return-type -verify -fblocks -Wno-unreachable-code -Wno-unused-value
|
|
#ifndef STD_COROUTINE_H
|
|
#define STD_COROUTINE_H
|
|
|
|
namespace std {
|
|
|
|
template <class Ret, typename... T>
|
|
struct coroutine_traits { using promise_type = typename Ret::promise_type; };
|
|
|
|
template <class Promise = void>
|
|
struct coroutine_handle {
|
|
static coroutine_handle from_address(void *) noexcept;
|
|
constexpr void* address() const noexcept;
|
|
};
|
|
template <>
|
|
struct coroutine_handle<void> {
|
|
template <class PromiseType>
|
|
coroutine_handle(coroutine_handle<PromiseType>) noexcept;
|
|
static coroutine_handle from_address(void *);
|
|
constexpr void* address() const noexcept;
|
|
};
|
|
|
|
struct suspend_always {
|
|
bool await_ready() noexcept { return false; }
|
|
void await_suspend(coroutine_handle<>) noexcept {}
|
|
void await_resume() noexcept {}
|
|
};
|
|
|
|
struct suspend_never {
|
|
bool await_ready() noexcept { return true; }
|
|
void await_suspend(coroutine_handle<>) noexcept {}
|
|
void await_resume() noexcept {}
|
|
};
|
|
|
|
} // namespace std
|
|
|
|
#endif // STD_COROUTINE_H
|