diff options
author | Marek Polacek <polacek@redhat.com> | 2021-03-09 20:55:14 -0500 |
---|---|---|
committer | Marek Polacek <polacek@redhat.com> | 2021-03-18 20:09:44 -0400 |
commit | bd9b262fa9243e08fefa4973f08d1f09f6694ba0 (patch) | |
tree | 4bd3bec7bf0cf91ad0c17bb131025cc63c3ba2fd /gcc | |
parent | 96ccb325432822f0f5b22bb44c2035ec1e7e8631 (diff) | |
download | gcc-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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/parser.c | 7 | ||||
-rw-r--r-- | 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 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" } |