public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [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).