diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc index 64b97535c8d..ad276592231 100644 --- a/gcc/cp/coroutines.cc +++ b/gcc/cp/coroutines.cc @@ -3932,6 +3932,11 @@ morph_fn_to_coro (tree orig, tree *resumer, tree *destroyer) NULL_TREE, LOOKUP_NORMAL, NULL, tf_warning_or_error); + /* ... but if that fails, returning an error, the later stages can't handle + the erroneous expression, so we reset the call as if it was absent. */ + if (grooaf == error_mark_node) + grooaf = NULL_TREE; + /* Allocate the frame, this has several possibilities: [dcl.fct.def.coroutine] / 9 (part 1) The allocation function’s name is looked up in the scope of the promise diff --git a/gcc/testsuite/g++.dg/coroutines/coro-bad-grooaf-00-static.C b/gcc/testsuite/g++.dg/coroutines/coro-bad-grooaf-00-static.C new file mode 100644 index 00000000000..e7d04346d57 --- /dev/null +++ b/gcc/testsuite/g++.dg/coroutines/coro-bad-grooaf-00-static.C @@ -0,0 +1,15 @@ +/* g-r-o-o-a-f should be static. */ + +#define BAD_GROOAF_STATIC +#define PROVIDE_GROOAF +#include "coro1-allocators.h" + +int used_grooaf = 0; + +struct coro1 +f () noexcept +{ + PRINT ("coro1: about to return"); + co_return; +} // { dg-error {cannot call member function 'coro1 coro1::promise_type::get_return_object_on_allocation_failure\(\)' without object} } + diff --git a/gcc/testsuite/g++.dg/coroutines/coro1-allocators.h b/gcc/testsuite/g++.dg/coroutines/coro1-allocators.h index 3d869106006..f7a85e9e671 100644 --- a/gcc/testsuite/g++.dg/coroutines/coro1-allocators.h +++ b/gcc/testsuite/g++.dg/coroutines/coro1-allocators.h @@ -172,8 +172,11 @@ struct coro1 { } #endif +#ifndef BAD_GROOAF_STATIC +# define BAD_GROOAF_STATIC static +#endif #ifdef PROVIDE_GROOAF - static coro1 get_return_object_on_allocation_failure () noexcept { + BAD_GROOAF_STATIC coro1 get_return_object_on_allocation_failure () noexcept { PRINT ("alloc fail return"); used_grooaf++; return coro1 (nullptr);