diff mbox series

c++: Fix ICE with invalid requires-expression [PR100055]

Message ID 20210428205509.276733-1-polacek@redhat.com
State New
Headers show
Series c++: Fix ICE with invalid requires-expression [PR100055] | expand

Commit Message

Marek Polacek April 28, 2021, 8:55 p.m. UTC
This fixes a crash on invalid requires-expression: in this test,
current_template_parms is null so accessing TEMPLATE_PARMS_CONSTRAINTS
is going to fail.  So don't crash, but make sure we've complained
already.

Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?

gcc/cp/ChangeLog:

	PR c++/100055
	* decl.c (grokfndecl): Check current_template_parms.

gcc/testsuite/ChangeLog:

	PR c++/100055
	* g++.dg/concepts/diagnostic18.C: New test.
---
 gcc/cp/decl.c                                | 9 ++++++++-
 gcc/testsuite/g++.dg/concepts/diagnostic18.C | 7 +++++++
 2 files changed, 15 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/concepts/diagnostic18.C


base-commit: c99f3747131377956e3bd8e393911c959ef5ff34

Comments

Jason Merrill May 3, 2021, 4:28 p.m. UTC | #1
On 4/28/21 4:55 PM, Marek Polacek wrote:
> This fixes a crash on invalid requires-expression: in this test,
> current_template_parms is null so accessing TEMPLATE_PARMS_CONSTRAINTS
> is going to fail.  So don't crash, but make sure we've complained
> already.
> 
> Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?

OK.

> gcc/cp/ChangeLog:
> 
> 	PR c++/100055
> 	* decl.c (grokfndecl): Check current_template_parms.
> 
> gcc/testsuite/ChangeLog:
> 
> 	PR c++/100055
> 	* g++.dg/concepts/diagnostic18.C: New test.
> ---
>   gcc/cp/decl.c                                | 9 ++++++++-
>   gcc/testsuite/g++.dg/concepts/diagnostic18.C | 7 +++++++
>   2 files changed, 15 insertions(+), 1 deletion(-)
>   create mode 100644 gcc/testsuite/g++.dg/concepts/diagnostic18.C
> 
> diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
> index 60dc2bf182d..1437457241e 100644
> --- a/gcc/cp/decl.c
> +++ b/gcc/cp/decl.c
> @@ -9702,7 +9702,14 @@ grokfndecl (tree ctype,
>   		      && (processing_template_decl
>   			  > template_class_depth (ctx)));
>         if (memtmpl)
> -        tmpl_reqs = TEMPLATE_PARMS_CONSTRAINTS (current_template_parms);
> +	{
> +	  if (!current_template_parms)
> +	    /* If there are no template parameters, something must have
> +	       gone wrong.  */
> +	    gcc_assert (seen_error ());
> +	  else
> +	    tmpl_reqs = TEMPLATE_PARMS_CONSTRAINTS (current_template_parms);
> +	}
>         tree ci = build_constraints (tmpl_reqs, decl_reqs);
>         if (concept_p && ci)
>           {
> diff --git a/gcc/testsuite/g++.dg/concepts/diagnostic18.C b/gcc/testsuite/g++.dg/concepts/diagnostic18.C
> new file mode 100644
> index 00000000000..79f371b8092
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/concepts/diagnostic18.C
> @@ -0,0 +1,7 @@
> +// PR c++/100055
> +// { dg-do compile { target concepts } }
> +
> +void foo(auto&& arg) requires({}); // { dg-error "statement-expressions are not allowed|braced-groups" }
> +
> +template <auto = 0> requires ([]{}()); // { dg-error "expected unqualified-id" }
> +auto f() requires ([]{}());
> 
> base-commit: c99f3747131377956e3bd8e393911c959ef5ff34
>
diff mbox series

Patch

diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 60dc2bf182d..1437457241e 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -9702,7 +9702,14 @@  grokfndecl (tree ctype,
 		      && (processing_template_decl
 			  > template_class_depth (ctx)));
       if (memtmpl)
-        tmpl_reqs = TEMPLATE_PARMS_CONSTRAINTS (current_template_parms);
+	{
+	  if (!current_template_parms)
+	    /* If there are no template parameters, something must have
+	       gone wrong.  */
+	    gcc_assert (seen_error ());
+	  else
+	    tmpl_reqs = TEMPLATE_PARMS_CONSTRAINTS (current_template_parms);
+	}
       tree ci = build_constraints (tmpl_reqs, decl_reqs);
       if (concept_p && ci)
         {
diff --git a/gcc/testsuite/g++.dg/concepts/diagnostic18.C b/gcc/testsuite/g++.dg/concepts/diagnostic18.C
new file mode 100644
index 00000000000..79f371b8092
--- /dev/null
+++ b/gcc/testsuite/g++.dg/concepts/diagnostic18.C
@@ -0,0 +1,7 @@ 
+// PR c++/100055
+// { dg-do compile { target concepts } }
+
+void foo(auto&& arg) requires({}); // { dg-error "statement-expressions are not allowed|braced-groups" }
+
+template <auto = 0> requires ([]{}()); // { dg-error "expected unqualified-id" }
+auto f() requires ([]{}());