blob: 8c37b1e9838d389b262c76f7934f9e94db1ac6ed [file]
// Tests defination of get-return-object-invocation [dcl.fct.def.coroutine] (and CWG2563)
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c++20 -emit-llvm %s -o - -disable-llvm-passes | FileCheck %s
#include "Inputs/coroutine.h"
using namespace std;
extern "C" {
void wrong();
}
template<bool LValue>
struct Promise {
Promise() = default;
Promise(const Promise&) { wrong(); }
Promise(Promise&&) { wrong(); }
// Tests: decltype(auto) gro = promise.get_return_object();
auto&& get_return_object() {
if constexpr (LValue)
return *this;
else
return static_cast<Promise&&>(*this);
}
std::suspend_never initial_suspend() const { return {}; }
std::suspend_never final_suspend() const noexcept { return {}; }
void return_void() const {}
void unhandled_exception() const noexcept {}
};
template<bool LValue>
struct Handle {
using promise_type = Promise<LValue>;
Handle(promise_type& p) {
if constexpr (!LValue)
wrong();
}
Handle(promise_type&& p) {
if constexpr (LValue)
wrong();
}
};
Handle<true> lvalue() {
co_return;
}
Handle<false> rvalue() {
co_return;
}
// CHECK-NOT: call void @wrong