[gcc r11-7727] c++: Fix error-recovery with requires expression [PR99500]

Marek Polacek mpolacek@gcc.gnu.org
Fri Mar 19 00:10:18 GMT 2021


https://gcc.gnu.org/g:bd9b262fa9243e08fefa4973f08d1f09f6694ba0

commit r11-7727-gbd9b262fa9243e08fefa4973f08d1f09f6694ba0
Author: Marek Polacek <polacek@redhat.com>
Date:   Tue Mar 9 20:55:14 2021 -0500

    c++: Fix error-recovery with requires expression [PR99500]
    
    This fixes an ICE on invalid code where one of the parameters was
    error_mark_node and thus resetting its DECL_CONTEXT crashed.
    
    gcc/cp/ChangeLog:
    
            PR c++/99500
            * parser.c (cp_parser_requirement_parameter_list): Handle
            error_mark_node.
    
    gcc/testsuite/ChangeLog:
    
            PR c++/99500
            * g++.dg/cpp2a/concepts-err3.C: New test.

Diff:
---
 gcc/cp/parser.c                            | 7 +++++--
 gcc/testsuite/g++.dg/cpp2a/concepts-err3.C | 4 ++++
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index d4e485930a4..ced4bd5a0e5 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -28839,8 +28839,11 @@ cp_parser_requirement_parameter_list (cp_parser *parser)
       if (parm == void_list_node || parm == explicit_void_list_node)
 	break;
       tree decl = TREE_VALUE (parm);
-      DECL_CONTEXT (decl) = NULL_TREE;
-      CONSTRAINT_VAR_P (decl) = true;
+      if (decl != error_mark_node)
+	{
+	  DECL_CONTEXT (decl) = NULL_TREE;
+	  CONSTRAINT_VAR_P (decl) = true;
+	}
     }
 
   return parms;
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-err3.C b/gcc/testsuite/g++.dg/cpp2a/concepts-err3.C
new file mode 100644
index 00000000000..9427fd5c5a6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/concepts-err3.C
@@ -0,0 +1,4 @@
+// PR c++/99500
+// { dg-do compile { target c++20 } }
+
+bool b = requires (bool a, int a) { requires true; }; // { dg-error "conflicting declaration" }


More information about the Gcc-cvs mailing list