aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2021-03-09 20:55:14 -0500
committerMarek Polacek <polacek@redhat.com>2021-03-18 20:09:44 -0400
commitbd9b262fa9243e08fefa4973f08d1f09f6694ba0 (patch)
tree4bd3bec7bf0cf91ad0c17bb131025cc63c3ba2fd
parent96ccb325432822f0f5b22bb44c2035ec1e7e8631 (diff)
downloadgcc-bd9b262fa9243e08fefa4973f08d1f09f6694ba0.zip
gcc-bd9b262fa9243e08fefa4973f08d1f09f6694ba0.tar.gz
gcc-bd9b262fa9243e08fefa4973f08d1f09f6694ba0.tar.bz2
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.
-rw-r--r--gcc/cp/parser.c7
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/concepts-err3.C4
2 files changed, 9 insertions, 2 deletions
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index d4e4859..ced4bd5 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 0000000..9427fd5c
--- /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" }