diff --git a/gcc/internal-fn.def b/gcc/internal-fn.def index 75b527b1ab0bba019d2f7f7b100a77fb7b6fbe29..23b4ab02b3003225b4435e2886251dd7787aa535 100644 --- a/gcc/internal-fn.def +++ b/gcc/internal-fn.def @@ -569,7 +569,7 @@ DEF_INTERNAL_FN (DIVMOD, ECF_CONST | ECF_LEAF, NULL) /* For coroutines. */ DEF_INTERNAL_FN (CO_ACTOR, ECF_NOTHROW | ECF_LEAF, NULL) -DEF_INTERNAL_FN (CO_YIELD, ECF_NOTHROW, NULL) +DEF_INTERNAL_FN (CO_YIELD, ECF_NOTHROW | ECF_LEAF, NULL) DEF_INTERNAL_FN (CO_SUSPN, ECF_NOTHROW, NULL) DEF_INTERNAL_FN (CO_FRAME, ECF_PURE | ECF_NOTHROW | ECF_LEAF, NULL) diff --git a/gcc/testsuite/g++.dg/coroutines/pr106973.C b/gcc/testsuite/g++.dg/coroutines/pr106973.C new file mode 100644 index 0000000000000000000000000000000000000000..6db6cbc7711a6edcffeca09257d92eb20e5a8ece --- /dev/null +++ b/gcc/testsuite/g++.dg/coroutines/pr106973.C @@ -0,0 +1,22 @@ +// https://gcc.gnu.org/PR106973 +// { dg-require-effective-target indirect_jumps } +#include <coroutine> +#include <setjmp.h> + +struct generator; +struct generator_promise { + generator get_return_object(); + std::suspend_always initial_suspend(); + std::suspend_always final_suspend() noexcept; + std::suspend_always yield_value(int); + void unhandled_exception(); +}; + +struct generator { + using promise_type = generator_promise; +}; +jmp_buf foo_env; +generator foo() { + setjmp(foo_env); + co_yield 1; +}