52 lines · cpp
1// Tests that we'll emit the proper diagnostic message if we failed to find `::operator new(size_t, nothrow_t)`.2// RUN: %clang_cc1 %s -std=c++20 %s -fsyntax-only -verify3 4namespace std {5template <typename... T>6struct coroutine_traits;7 8template <class Promise = void>9struct coroutine_handle {10 coroutine_handle() = default;11 static coroutine_handle from_address(void *) noexcept { return {}; }12};13 14template <>15struct coroutine_handle<void> {16 static coroutine_handle from_address(void *) { return {}; }17 coroutine_handle() = default;18 template <class PromiseType>19 coroutine_handle(coroutine_handle<PromiseType>) noexcept {}20};21 22struct suspend_always {23 bool await_ready() noexcept { return false; }24 void await_suspend(std::coroutine_handle<>) noexcept {}25 void await_resume() noexcept {}26};27 28struct nothrow_t {};29constexpr nothrow_t nothrow = {};30 31} // end namespace std32 33using SizeT = decltype(sizeof(int));34 35struct promise_on_alloc_failure_tag {};36 37template <>38struct std::coroutine_traits<int, promise_on_alloc_failure_tag> {39 struct promise_type {40 int get_return_object() { return 0; }41 std::suspend_always initial_suspend() { return {}; }42 std::suspend_always final_suspend() noexcept { return {}; }43 void return_void() {}44 void unhandled_exception() {}45 static int get_return_object_on_allocation_failure() { return -1; }46 };47};48 49extern "C" int f(promise_on_alloc_failure_tag) { // expected-error 1+{{unable to find '::operator new(size_t, nothrow_t)' for 'f'}}50 co_return;51}52