brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.6 KiB · bcebadc Raw
53 lines · cpp
1// Tests that we wouldn't generate an allocation call in promise_type with (std::size_t, std::nothrow_t) in case we find promsie_type::get_return_object_on_allocation_failure;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    void *operator new(SizeT, std::nothrow_t) noexcept;47  };48};49 50extern "C" int f(promise_on_alloc_failure_tag) { // expected-error 1+{{is not usable with the function signature of 'f'}}51    co_return;52}53