--- gcc/cp/coroutines.cc | 2 + .../torture/lambda-10-co-await-lambda.C | 47 +++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 gcc/testsuite/g++.dg/coroutines/torture/lambda-10-co-await-lambda.C diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc index decec4550af..004e0a1a659 100644 --- a/gcc/cp/coroutines.cc +++ b/gcc/cp/coroutines.cc @@ -2735,6 +2735,8 @@ maybe_promote_captured_temps (tree *stmt, void *d) } BIND_EXPR_BLOCK (aw_bind) = b_block; + /* Set side effects flag since the BIND_EXPR contains co_await expr. */ + TREE_SIDE_EFFECTS (aw_bind) = 1; *stmt = aw_bind; } return res; diff --git a/gcc/testsuite/g++.dg/coroutines/torture/lambda-10-co-await-lambda.C b/gcc/testsuite/g++.dg/coroutines/torture/lambda-10-co-await-lambda.C new file mode 100644 index 00000000000..43d4ff6b77e --- /dev/null +++ b/gcc/testsuite/g++.dg/coroutines/torture/lambda-10-co-await-lambda.C @@ -0,0 +1,47 @@ +// { dg-do run } + +#include "../coro.h" +template struct a; +struct b { + struct c { + int await_ready() {return 0;} + template void await_suspend(d) {} + void await_resume() noexcept {} + }; + auto initial_suspend() { return std::suspend_never{}; } + auto final_suspend() { return c{}; } +}; +template struct e { + int f() {return 1;} +}; +template <> struct e : b { + a get_return_object() noexcept; + void unhandled_exception(); +}; +template struct a { + using promise_type = e; + struct h { + std::coroutine_handle j; + int await_ready() {return 0;} + bool await_suspend(std::coroutine_handle<>) { return false;} + }; + auto operator co_await() { + struct awaitable : h { + auto await_resume() { return this->j.promise().f(); } + }; + return awaitable{}; + } +}; +a<> e::get_return_object() noexcept { return a<>{};} + +int main() { + auto k = []() -> a { return a{};}; + int l = 0 ; + auto m = [&]() -> a<> { + for (int i; i < 100; ++i) + l += co_await k(); + }; + m(); + if (l != 100) + abort(); +} -- 2.19.1.3.ge56e4f7