| // Tests that the behavior will be good if there are multiple operator delete in the promise_type. |
| // RUN: %clang_cc1 %s -std=c++20 %s -fsyntax-only -verify |
| // expected-no-diagnostics |
| |
| #include "Inputs/std-coroutine.h" |
| |
| namespace std { |
| typedef __SIZE_TYPE__ size_t; |
| enum class align_val_t : size_t {}; |
| } |
| |
| struct task { |
| struct promise_type { |
| auto initial_suspend() { return std::suspend_always{}; } |
| auto final_suspend() noexcept { return std::suspend_always{}; } |
| auto get_return_object() { return task{}; } |
| void unhandled_exception() {} |
| void return_value(int) {} |
| |
| void operator delete(void *ptr, void *meaningless_placeholder); |
| void operator delete(void *ptr); |
| }; |
| }; |
| |
| task f() { |
| co_return 43; |
| } |
| |
| // From https://github.com/llvm/llvm-project/issues/60545 |
| struct generator { |
| struct promise_type { |
| generator get_return_object(); |
| std::suspend_always initial_suspend(); |
| std::suspend_always final_suspend() noexcept; |
| void return_void(); |
| [[noreturn]] void unhandled_exception(); |
| |
| static void* operator new(std::size_t size); |
| static void operator delete(void* ptr, const std::size_t size); |
| }; |
| }; |
| |
| generator goo() { co_return; } |