]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: Fix error-recovery with requires expression [PR99500]
authorMarek Polacek <polacek@redhat.com>
Wed, 10 Mar 2021 01:55:14 +0000 (20:55 -0500)
committerMarek Polacek <polacek@redhat.com>
Fri, 19 Mar 2021 00:09:44 +0000 (20:09 -0400)
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.

gcc/cp/parser.c
gcc/testsuite/g++.dg/cpp2a/concepts-err3.C [new file with mode: 0644]

index d4e485930a4f0f5cc1457c4dc55ded873ac4a8a0..ced4bd5a0e5182ab10e60d40162d82b16b4a4847 100644 (file)
@@ -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 (file)
index 0000000..9427fd5
--- /dev/null
@@ -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" }