================ @@ -0,0 +1,184 @@ +// RUN: %clang_cc1 -triple x86_64-apple-darwin9 %s -std=c++20 -fsyntax-only -verify -Wall -Wextra -Wno-error=unreachable-code -Wno-unused + +#include "Inputs/std-coroutine.h" + +using std::suspend_always; +using std::suspend_never; + + +#define CORO_TYPE [[clang::annotate("coro_type")]] +#define CORO_UNSAFE [[clang::annotate("coro_unsafe")]] + +template <typename T> struct CORO_TYPE Gen { + struct promise_type { + Gen<T> get_return_object() { + return {}; + } + suspend_always initial_suspend(); + suspend_always final_suspend() noexcept; + void unhandled_exception(); + void return_value(const T &t); + + template <typename U> + auto await_transform(const Gen<U> &) { + struct awaitable { + bool await_ready() noexcept { return false; } + void await_suspend(std::coroutine_handle<>) noexcept {} + U await_resume() noexcept { return {}; } + }; + return awaitable{}; + } + }; +}; + +template <typename T> using Co = Gen<T>; + +Gen<int> foo_coro(const int& b); + +Gen<int> plain_return_foo_decl(int b) { + return foo_coro(b); // expected-warning {{address of stack memory associated with parameter}} +} + +Gen<int> foo_coro(const int& b) { + if (b > 0) + co_return 1; + co_return 2; +} + +int getInt() { return 0; } + +Co<int> bar_coro(const int &b, int c) { + int x = co_await foo_coro(b); + int y = co_await foo_coro(1); ---------------- usx95 wrote:
This is because we never emit warnings for `auto x = SomeFunc(foo_coro(1));` For `co_await` expr, the `func` is `await_transform`. See https://godbolt.org/z/soxK1KsWc The only implementation of awaiter which could be problematic and go undetected is when it schedules the foo_coro on other thread. https://github.com/llvm/llvm-project/pull/69360 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits