brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.5 KiB · 629ac88 Raw
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