* [PATCH 1/2] c++: fix ICE on FUNCTION_DECLs inside coroutines [PR115906]
@ 2024-07-29 12:18 Arsen Arsenović
2024-07-29 12:18 ` [PATCH 2/2] c++: diagnose usage of co_await and co_yield in default args [PR115906] Arsen Arsenović
2024-07-29 20:01 ` [PATCH 1/2] c++: fix ICE on FUNCTION_DECLs inside coroutines [PR115906] Jason Merrill
0 siblings, 2 replies; 5+ messages in thread
From: Arsen Arsenović @ 2024-07-29 12:18 UTC (permalink / raw)
To: gcc-patches; +Cc: Jason Merrill, Iain Sandoe, Arsen Arsenović
When register_local_var_uses iterates a BIND_EXPRs BIND_EXPR_VARS, it
fails to account for the fact that FUNCTION_DECLs might be present, and
later passes it to DECL_HAS_VALUE_EXPR_P. This leads to a tree check
failure in DECL_HAS_VALUE_EXPR_P:
tree check: expected var_decl or parm_decl or result_decl, have
function_decl in register_local_var_uses
Much like types and namespaces, we don't need to check FUNCTION_DECLs.
Simply skip them.
PR c++/115906 - [coroutines] missing diagnostic and ICE when co_await used as default argument in function declaration
gcc/cp/ChangeLog:
PR c++/115906
* coroutines.cc (register_local_var_uses): Skip FUNCTION_DECLs.
gcc/testsuite/ChangeLog:
PR c++/115906
* g++.dg/coroutines/coro-function-decl.C: New test.
---
Tested on x86_64-pc-linux-gnu.
OK for trunk?
TIA, have a lovely day.
gcc/cp/coroutines.cc | 1 +
.../g++.dg/coroutines/coro-function-decl.C | 19 +++++++++++++++++++
2 files changed, 20 insertions(+)
create mode 100644 gcc/testsuite/g++.dg/coroutines/coro-function-decl.C
diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc
index 2b16b4814d10..8cd619d7eaed 100644
--- a/gcc/cp/coroutines.cc
+++ b/gcc/cp/coroutines.cc
@@ -3928,6 +3928,7 @@ register_local_var_uses (tree *stmt, int *do_subtree, void *d)
/* Make sure that we only present vars to the tests below. */
if (TREE_CODE (lvar) == TYPE_DECL
+ || TREE_CODE (lvar) == FUNCTION_DECL
|| TREE_CODE (lvar) == NAMESPACE_DECL)
continue;
diff --git a/gcc/testsuite/g++.dg/coroutines/coro-function-decl.C b/gcc/testsuite/g++.dg/coroutines/coro-function-decl.C
new file mode 100644
index 000000000000..86140569a76e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/coroutines/coro-function-decl.C
@@ -0,0 +1,19 @@
+#include <coroutine>
+
+struct task
+{
+ struct promise_type
+ {
+ std::suspend_always initial_suspend () { return {}; }
+ std::suspend_always final_suspend () noexcept { return {}; }
+ void unhandled_exception () {}
+ task get_return_object () noexcept { return {}; }
+ void return_void () {}
+ };
+};
+
+task foo ()
+{
+ void bar ();
+ co_return;
+}
--
2.45.2
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 2/2] c++: diagnose usage of co_await and co_yield in default args [PR115906]
2024-07-29 12:18 [PATCH 1/2] c++: fix ICE on FUNCTION_DECLs inside coroutines [PR115906] Arsen Arsenović
@ 2024-07-29 12:18 ` Arsen Arsenović
2024-07-29 20:02 ` Jason Merrill
2024-07-29 20:01 ` [PATCH 1/2] c++: fix ICE on FUNCTION_DECLs inside coroutines [PR115906] Jason Merrill
1 sibling, 1 reply; 5+ messages in thread
From: Arsen Arsenović @ 2024-07-29 12:18 UTC (permalink / raw)
To: gcc-patches; +Cc: Jason Merrill, Iain Sandoe, Arsen Arsenović
This is a partial fix for PR115906. Per [expr.await] 2s3, "An
await-expression shall not appear in a default argument
([dcl.fct.default])". This patch introduces the diagnostic in that
case, and in the case of a co_yield (as co_yield is defined in terms of
co_await, so prerequisites of co_await hold).
PR c++/115906 - [coroutines] missing diagnostic and ICE when co_await used as default argument in function declaration
gcc/cp/ChangeLog:
PR c++/115906
* parser.cc (cp_parser_unary_expression): Reject await
expressions if use of local variables is currently forbidden.
(cp_parser_yield_expression): Reject yield expressions if use of
local variables is currently forbidden.
gcc/testsuite/ChangeLog:
PR c++/115906
* g++.dg/coroutines/pr115906-yield.C: New test.
* g++.dg/coroutines/pr115906.C: New test.
* g++.dg/coroutines/co-await-syntax-02-outside-fn.C: Don't rely
on default arguments.
* g++.dg/coroutines/co-yield-syntax-01-outside-fn.C: Ditto.
---
gcc/cp/parser.cc | 17 ++++++++++
.../co-await-syntax-02-outside-fn.C | 2 +-
.../co-yield-syntax-01-outside-fn.C | 3 +-
.../g++.dg/coroutines/pr115906-yield.C | 29 +++++++++++++++++
gcc/testsuite/g++.dg/coroutines/pr115906.C | 32 +++++++++++++++++++
5 files changed, 80 insertions(+), 3 deletions(-)
create mode 100644 gcc/testsuite/g++.dg/coroutines/pr115906-yield.C
create mode 100644 gcc/testsuite/g++.dg/coroutines/pr115906.C
diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index f79736c17ac6..5cba35eff1c1 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -9242,6 +9242,14 @@ cp_parser_unary_expression (cp_parser *parser, cp_id_kind * pidk,
if (expr == error_mark_node)
return error_mark_node;
+ /* ... but, we cannot use co_await in default arguments. */
+ if (parser->local_variables_forbidden_p & LOCAL_VARS_FORBIDDEN)
+ {
+ error_at (kw_loc,
+ "%<co_await%> cannot be used in default arguments");
+ return error_mark_node;
+ }
+
/* Handle [expr.await]. */
return cp_expr (finish_co_await_expr (kw_loc, expr));
}
@@ -29646,6 +29654,15 @@ cp_parser_yield_expression (cp_parser* parser)
else
expr = cp_parser_assignment_expression (parser);
+ /* Similar to co_await, we cannot use co_yield in default arguments (as
+ co_awaits underlie co_yield). */
+ if (parser->local_variables_forbidden_p & LOCAL_VARS_FORBIDDEN)
+ {
+ error_at (kw_loc,
+ "%<co_yield%> cannot be used in default arguments");
+ return error_mark_node;
+ }
+
if (expr == error_mark_node)
return expr;
diff --git a/gcc/testsuite/g++.dg/coroutines/co-await-syntax-02-outside-fn.C b/gcc/testsuite/g++.dg/coroutines/co-await-syntax-02-outside-fn.C
index 4ce5c2e04a0a..132128f27192 100644
--- a/gcc/testsuite/g++.dg/coroutines/co-await-syntax-02-outside-fn.C
+++ b/gcc/testsuite/g++.dg/coroutines/co-await-syntax-02-outside-fn.C
@@ -2,4 +2,4 @@
#include "coro.h"
-auto f (int x = co_await coro::suspend_always{}); // { dg-error {'co_await' cannot be used outside a function} }
+auto x = co_await coro::suspend_always{}; // { dg-error {'co_await' cannot be used outside a function} }
diff --git a/gcc/testsuite/g++.dg/coroutines/co-yield-syntax-01-outside-fn.C b/gcc/testsuite/g++.dg/coroutines/co-yield-syntax-01-outside-fn.C
index 30db0e963b09..51c304625278 100644
--- a/gcc/testsuite/g++.dg/coroutines/co-yield-syntax-01-outside-fn.C
+++ b/gcc/testsuite/g++.dg/coroutines/co-yield-syntax-01-outside-fn.C
@@ -2,5 +2,4 @@
#include "coro.h"
-auto f (int x = co_yield 5); // { dg-error {'co_yield' cannot be used outside a function} }
-
+auto x = co_yield 5; // { dg-error {'co_yield' cannot be used outside a function} }
diff --git a/gcc/testsuite/g++.dg/coroutines/pr115906-yield.C b/gcc/testsuite/g++.dg/coroutines/pr115906-yield.C
new file mode 100644
index 000000000000..f8b6ded5001c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/coroutines/pr115906-yield.C
@@ -0,0 +1,29 @@
+#include <coroutine>
+
+struct Promise;
+
+struct Handle : std::coroutine_handle<Promise> {
+ using promise_type = Promise;
+};
+
+struct Promise {
+ Handle get_return_object() noexcept {
+ return {Handle::from_promise(*this)};
+ }
+ std::suspend_never initial_suspend() const noexcept { return {}; }
+ std::suspend_never final_suspend() const noexcept { return {}; }
+ void return_void() const noexcept {}
+ void unhandled_exception() const noexcept {}
+ std::suspend_never yield_value(int) { return {}; }
+};
+
+Handle Coro() {
+ [] (int x = co_yield 1){}; // { dg-error ".co_yield. cannot be used in default arguments" }
+ co_return;
+}
+
+int main() {
+ Coro();
+
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/coroutines/pr115906.C b/gcc/testsuite/g++.dg/coroutines/pr115906.C
new file mode 100644
index 000000000000..28f408fbaddd
--- /dev/null
+++ b/gcc/testsuite/g++.dg/coroutines/pr115906.C
@@ -0,0 +1,32 @@
+#include <coroutine>
+
+struct Promise;
+
+struct Handle : std::coroutine_handle<Promise> {
+ using promise_type = Promise;
+};
+
+struct Promise {
+ Handle get_return_object() noexcept {
+ return {Handle::from_promise(*this)};
+ }
+ std::suspend_never initial_suspend() const noexcept { return {}; }
+ std::suspend_never final_suspend() const noexcept { return {}; }
+ void return_void() const noexcept {}
+ void unhandled_exception() const noexcept {}
+};
+
+Handle Coro() {
+ struct Awaiter : std::suspend_never {
+ int await_resume() { return 0; }
+ };
+
+ [] (int x = co_await Awaiter{}){}; // { dg-error ".co_await. cannot be used in default arguments" }
+ co_return;
+}
+
+int main() {
+ Coro();
+
+ return 0;
+}
--
2.45.2
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 1/2] c++: fix ICE on FUNCTION_DECLs inside coroutines [PR115906]
2024-07-29 12:18 [PATCH 1/2] c++: fix ICE on FUNCTION_DECLs inside coroutines [PR115906] Arsen Arsenović
2024-07-29 12:18 ` [PATCH 2/2] c++: diagnose usage of co_await and co_yield in default args [PR115906] Arsen Arsenović
@ 2024-07-29 20:01 ` Jason Merrill
2024-07-29 23:01 ` Arsen Arsenović
1 sibling, 1 reply; 5+ messages in thread
From: Jason Merrill @ 2024-07-29 20:01 UTC (permalink / raw)
To: Arsen Arsenović, gcc-patches; +Cc: Iain Sandoe
On 7/29/24 8:18 AM, Arsen Arsenović wrote:
> When register_local_var_uses iterates a BIND_EXPRs BIND_EXPR_VARS, it
> fails to account for the fact that FUNCTION_DECLs might be present, and
> later passes it to DECL_HAS_VALUE_EXPR_P. This leads to a tree check
> failure in DECL_HAS_VALUE_EXPR_P:
>
> tree check: expected var_decl or parm_decl or result_decl, have
> function_decl in register_local_var_uses
>
> Much like types and namespaces, we don't need to check FUNCTION_DECLs.
> Simply skip them.
If we only want variables (including parms), it seems better to check
for them rather than "not all other things"?
> PR c++/115906 - [coroutines] missing diagnostic and ICE when co_await used as default argument in function declaration
>
> gcc/cp/ChangeLog:
>
> PR c++/115906
> * coroutines.cc (register_local_var_uses): Skip FUNCTION_DECLs.
>
> gcc/testsuite/ChangeLog:
>
> PR c++/115906
> * g++.dg/coroutines/coro-function-decl.C: New test.
> ---
> Tested on x86_64-pc-linux-gnu.
>
> OK for trunk?
>
> TIA, have a lovely day.
>
> gcc/cp/coroutines.cc | 1 +
> .../g++.dg/coroutines/coro-function-decl.C | 19 +++++++++++++++++++
> 2 files changed, 20 insertions(+)
> create mode 100644 gcc/testsuite/g++.dg/coroutines/coro-function-decl.C
>
> diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc
> index 2b16b4814d10..8cd619d7eaed 100644
> --- a/gcc/cp/coroutines.cc
> +++ b/gcc/cp/coroutines.cc
> @@ -3928,6 +3928,7 @@ register_local_var_uses (tree *stmt, int *do_subtree, void *d)
>
> /* Make sure that we only present vars to the tests below. */
> if (TREE_CODE (lvar) == TYPE_DECL
> + || TREE_CODE (lvar) == FUNCTION_DECL
> || TREE_CODE (lvar) == NAMESPACE_DECL)
> continue;
>
> diff --git a/gcc/testsuite/g++.dg/coroutines/coro-function-decl.C b/gcc/testsuite/g++.dg/coroutines/coro-function-decl.C
> new file mode 100644
> index 000000000000..86140569a76e
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/coroutines/coro-function-decl.C
> @@ -0,0 +1,19 @@
> +#include <coroutine>
> +
> +struct task
> +{
> + struct promise_type
> + {
> + std::suspend_always initial_suspend () { return {}; }
> + std::suspend_always final_suspend () noexcept { return {}; }
> + void unhandled_exception () {}
> + task get_return_object () noexcept { return {}; }
> + void return_void () {}
> + };
> +};
> +
> +task foo ()
> +{
> + void bar ();
> + co_return;
> +}
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 2/2] c++: diagnose usage of co_await and co_yield in default args [PR115906]
2024-07-29 12:18 ` [PATCH 2/2] c++: diagnose usage of co_await and co_yield in default args [PR115906] Arsen Arsenović
@ 2024-07-29 20:02 ` Jason Merrill
0 siblings, 0 replies; 5+ messages in thread
From: Jason Merrill @ 2024-07-29 20:02 UTC (permalink / raw)
To: Arsen Arsenović, gcc-patches; +Cc: Iain Sandoe
On 7/29/24 8:18 AM, Arsen Arsenović wrote:
> This is a partial fix for PR115906. Per [expr.await] 2s3, "An
> await-expression shall not appear in a default argument
> ([dcl.fct.default])". This patch introduces the diagnostic in that
> case, and in the case of a co_yield (as co_yield is defined in terms of
> co_await, so prerequisites of co_await hold).
OK.
> PR c++/115906 - [coroutines] missing diagnostic and ICE when co_await used as default argument in function declaration
>
> gcc/cp/ChangeLog:
>
> PR c++/115906
> * parser.cc (cp_parser_unary_expression): Reject await
> expressions if use of local variables is currently forbidden.
> (cp_parser_yield_expression): Reject yield expressions if use of
> local variables is currently forbidden.
>
> gcc/testsuite/ChangeLog:
>
> PR c++/115906
> * g++.dg/coroutines/pr115906-yield.C: New test.
> * g++.dg/coroutines/pr115906.C: New test.
> * g++.dg/coroutines/co-await-syntax-02-outside-fn.C: Don't rely
> on default arguments.
> * g++.dg/coroutines/co-yield-syntax-01-outside-fn.C: Ditto.
> ---
> gcc/cp/parser.cc | 17 ++++++++++
> .../co-await-syntax-02-outside-fn.C | 2 +-
> .../co-yield-syntax-01-outside-fn.C | 3 +-
> .../g++.dg/coroutines/pr115906-yield.C | 29 +++++++++++++++++
> gcc/testsuite/g++.dg/coroutines/pr115906.C | 32 +++++++++++++++++++
> 5 files changed, 80 insertions(+), 3 deletions(-)
> create mode 100644 gcc/testsuite/g++.dg/coroutines/pr115906-yield.C
> create mode 100644 gcc/testsuite/g++.dg/coroutines/pr115906.C
>
> diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
> index f79736c17ac6..5cba35eff1c1 100644
> --- a/gcc/cp/parser.cc
> +++ b/gcc/cp/parser.cc
> @@ -9242,6 +9242,14 @@ cp_parser_unary_expression (cp_parser *parser, cp_id_kind * pidk,
> if (expr == error_mark_node)
> return error_mark_node;
>
> + /* ... but, we cannot use co_await in default arguments. */
> + if (parser->local_variables_forbidden_p & LOCAL_VARS_FORBIDDEN)
> + {
> + error_at (kw_loc,
> + "%<co_await%> cannot be used in default arguments");
> + return error_mark_node;
> + }
> +
> /* Handle [expr.await]. */
> return cp_expr (finish_co_await_expr (kw_loc, expr));
> }
> @@ -29646,6 +29654,15 @@ cp_parser_yield_expression (cp_parser* parser)
> else
> expr = cp_parser_assignment_expression (parser);
>
> + /* Similar to co_await, we cannot use co_yield in default arguments (as
> + co_awaits underlie co_yield). */
> + if (parser->local_variables_forbidden_p & LOCAL_VARS_FORBIDDEN)
> + {
> + error_at (kw_loc,
> + "%<co_yield%> cannot be used in default arguments");
> + return error_mark_node;
> + }
> +
> if (expr == error_mark_node)
> return expr;
>
> diff --git a/gcc/testsuite/g++.dg/coroutines/co-await-syntax-02-outside-fn.C b/gcc/testsuite/g++.dg/coroutines/co-await-syntax-02-outside-fn.C
> index 4ce5c2e04a0a..132128f27192 100644
> --- a/gcc/testsuite/g++.dg/coroutines/co-await-syntax-02-outside-fn.C
> +++ b/gcc/testsuite/g++.dg/coroutines/co-await-syntax-02-outside-fn.C
> @@ -2,4 +2,4 @@
>
> #include "coro.h"
>
> -auto f (int x = co_await coro::suspend_always{}); // { dg-error {'co_await' cannot be used outside a function} }
> +auto x = co_await coro::suspend_always{}; // { dg-error {'co_await' cannot be used outside a function} }
> diff --git a/gcc/testsuite/g++.dg/coroutines/co-yield-syntax-01-outside-fn.C b/gcc/testsuite/g++.dg/coroutines/co-yield-syntax-01-outside-fn.C
> index 30db0e963b09..51c304625278 100644
> --- a/gcc/testsuite/g++.dg/coroutines/co-yield-syntax-01-outside-fn.C
> +++ b/gcc/testsuite/g++.dg/coroutines/co-yield-syntax-01-outside-fn.C
> @@ -2,5 +2,4 @@
>
> #include "coro.h"
>
> -auto f (int x = co_yield 5); // { dg-error {'co_yield' cannot be used outside a function} }
> -
> +auto x = co_yield 5; // { dg-error {'co_yield' cannot be used outside a function} }
> diff --git a/gcc/testsuite/g++.dg/coroutines/pr115906-yield.C b/gcc/testsuite/g++.dg/coroutines/pr115906-yield.C
> new file mode 100644
> index 000000000000..f8b6ded5001c
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/coroutines/pr115906-yield.C
> @@ -0,0 +1,29 @@
> +#include <coroutine>
> +
> +struct Promise;
> +
> +struct Handle : std::coroutine_handle<Promise> {
> + using promise_type = Promise;
> +};
> +
> +struct Promise {
> + Handle get_return_object() noexcept {
> + return {Handle::from_promise(*this)};
> + }
> + std::suspend_never initial_suspend() const noexcept { return {}; }
> + std::suspend_never final_suspend() const noexcept { return {}; }
> + void return_void() const noexcept {}
> + void unhandled_exception() const noexcept {}
> + std::suspend_never yield_value(int) { return {}; }
> +};
> +
> +Handle Coro() {
> + [] (int x = co_yield 1){}; // { dg-error ".co_yield. cannot be used in default arguments" }
> + co_return;
> +}
> +
> +int main() {
> + Coro();
> +
> + return 0;
> +}
> diff --git a/gcc/testsuite/g++.dg/coroutines/pr115906.C b/gcc/testsuite/g++.dg/coroutines/pr115906.C
> new file mode 100644
> index 000000000000..28f408fbaddd
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/coroutines/pr115906.C
> @@ -0,0 +1,32 @@
> +#include <coroutine>
> +
> +struct Promise;
> +
> +struct Handle : std::coroutine_handle<Promise> {
> + using promise_type = Promise;
> +};
> +
> +struct Promise {
> + Handle get_return_object() noexcept {
> + return {Handle::from_promise(*this)};
> + }
> + std::suspend_never initial_suspend() const noexcept { return {}; }
> + std::suspend_never final_suspend() const noexcept { return {}; }
> + void return_void() const noexcept {}
> + void unhandled_exception() const noexcept {}
> +};
> +
> +Handle Coro() {
> + struct Awaiter : std::suspend_never {
> + int await_resume() { return 0; }
> + };
> +
> + [] (int x = co_await Awaiter{}){}; // { dg-error ".co_await. cannot be used in default arguments" }
> + co_return;
> +}
> +
> +int main() {
> + Coro();
> +
> + return 0;
> +}
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 1/2] c++: fix ICE on FUNCTION_DECLs inside coroutines [PR115906]
2024-07-29 20:01 ` [PATCH 1/2] c++: fix ICE on FUNCTION_DECLs inside coroutines [PR115906] Jason Merrill
@ 2024-07-29 23:01 ` Arsen Arsenović
0 siblings, 0 replies; 5+ messages in thread
From: Arsen Arsenović @ 2024-07-29 23:01 UTC (permalink / raw)
To: Jason Merrill; +Cc: gcc-patches, Iain Sandoe
[-- Attachment #1: Type: text/plain, Size: 2860 bytes --]
Jason Merrill <jason@redhat.com> writes:
> On 7/29/24 8:18 AM, Arsen Arsenović wrote:
>> When register_local_var_uses iterates a BIND_EXPRs BIND_EXPR_VARS, it
>> fails to account for the fact that FUNCTION_DECLs might be present, and
>> later passes it to DECL_HAS_VALUE_EXPR_P. This leads to a tree check
>> failure in DECL_HAS_VALUE_EXPR_P:
>> tree check: expected var_decl or parm_decl or result_decl, have
>> function_decl in register_local_var_uses
>> Much like types and namespaces, we don't need to check FUNCTION_DECLs.
>> Simply skip them.
>
> If we only want variables (including parms), it seems better to check for them
> rather than "not all other things"?
Admittedly, I am unsure why the approach that was taken initially was
taken. I'll regression test with:
TREE_CODE (lvar) != PARM_DECL && TREE_CODE (lvar) != VAR_DECL
... and reword the commit appropriately.
>> PR c++/115906 - [coroutines] missing diagnostic and ICE when co_await used as default argument in function declaration
>> gcc/cp/ChangeLog:
>> PR c++/115906
>> * coroutines.cc (register_local_var_uses): Skip FUNCTION_DECLs.
>> gcc/testsuite/ChangeLog:
>> PR c++/115906
>> * g++.dg/coroutines/coro-function-decl.C: New test.
>> ---
>> Tested on x86_64-pc-linux-gnu.
>> OK for trunk?
>> TIA, have a lovely day.
>> gcc/cp/coroutines.cc | 1 +
>> .../g++.dg/coroutines/coro-function-decl.C | 19 +++++++++++++++++++
>> 2 files changed, 20 insertions(+)
>> create mode 100644 gcc/testsuite/g++.dg/coroutines/coro-function-decl.C
>> diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc
>> index 2b16b4814d10..8cd619d7eaed 100644
>> --- a/gcc/cp/coroutines.cc
>> +++ b/gcc/cp/coroutines.cc
>> @@ -3928,6 +3928,7 @@ register_local_var_uses (tree *stmt, int *do_subtree, void *d)
>> /* Make sure that we only present vars to the tests below. */
>> if (TREE_CODE (lvar) == TYPE_DECL
>> + || TREE_CODE (lvar) == FUNCTION_DECL
>> || TREE_CODE (lvar) == NAMESPACE_DECL)
>> continue;
>> diff --git a/gcc/testsuite/g++.dg/coroutines/coro-function-decl.C
>> b/gcc/testsuite/g++.dg/coroutines/coro-function-decl.C
>> new file mode 100644
>> index 000000000000..86140569a76e
>> --- /dev/null
>> +++ b/gcc/testsuite/g++.dg/coroutines/coro-function-decl.C
>> @@ -0,0 +1,19 @@
>> +#include <coroutine>
>> +
>> +struct task
>> +{
>> + struct promise_type
>> + {
>> + std::suspend_always initial_suspend () { return {}; }
>> + std::suspend_always final_suspend () noexcept { return {}; }
>> + void unhandled_exception () {}
>> + task get_return_object () noexcept { return {}; }
>> + void return_void () {}
>> + };
>> +};
>> +
>> +task foo ()
>> +{
>> + void bar ();
>> + co_return;
>> +}
--
Arsen Arsenović
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 381 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2024-07-29 23:01 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-07-29 12:18 [PATCH 1/2] c++: fix ICE on FUNCTION_DECLs inside coroutines [PR115906] Arsen Arsenović
2024-07-29 12:18 ` [PATCH 2/2] c++: diagnose usage of co_await and co_yield in default args [PR115906] Arsen Arsenović
2024-07-29 20:02 ` Jason Merrill
2024-07-29 20:01 ` [PATCH 1/2] c++: fix ICE on FUNCTION_DECLs inside coroutines [PR115906] Jason Merrill
2024-07-29 23:01 ` Arsen Arsenović
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).