aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/parser.c
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2021-11-09 09:09:43 -0500
committerPatrick Palka <ppalka@redhat.com>2021-11-09 09:09:43 -0500
commita22d910305a5232694ff48ead37a7f53e46b7202 (patch)
treeec777e3f0d7206738003e4d6877153ef38463b46 /gcc/cp/parser.c
parenta19f09cb03d7f69377e6d12162e5d6df78a82849 (diff)
downloadgcc-a22d910305a5232694ff48ead37a7f53e46b7202.zip
gcc-a22d910305a5232694ff48ead37a7f53e46b7202.tar.gz
gcc-a22d910305a5232694ff48ead37a7f53e46b7202.tar.bz2
c++: bogus error w/ tentative type parse of concept-id [PR98394]
Here when tentatively parsing the if condition as a declaration, we try to treat C<1> as the start of a constrained placeholder type, which we quickly reject because C doesn't accept a type as its first argument. But since we're parsing tentatively, we shouldn't emit an error in this case. In passing, also fix PR85846 by only overriding 'tentative' to false when given a concept-name, and not also when given a concept-id that has an empty argument list. PR c++/98394 PR c++/85846 gcc/cp/ChangeLog: * parser.c (cp_parser_placeholder_type_specifier): Declare static. Don't override tentative to false when tmpl is a concept-id with empty argument list. Don't emit a "does not constrain a type" error when tentative. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/concepts-pr98394.C: New test. * g++.dg/cpp2a/concepts-pr85846.C: New test.
Diffstat (limited to 'gcc/cp/parser.c')
-rw-r--r--gcc/cp/parser.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 4c20757..6061f98 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -19855,7 +19855,7 @@ cp_parser_simple_type_specifier (cp_parser* parser,
Note that the Concepts TS allows the auto or decltype(auto) to be
omitted in a constrained-type-specifier. */
-tree
+static tree
cp_parser_placeholder_type_specifier (cp_parser *parser, location_t loc,
tree tmpl, bool tentative)
{
@@ -19871,7 +19871,7 @@ cp_parser_placeholder_type_specifier (cp_parser *parser, location_t loc,
args = TREE_OPERAND (tmpl, 1);
tmpl = TREE_OPERAND (tmpl, 0);
}
- if (args == NULL_TREE)
+ else
/* A concept-name with no arguments can't be an expression. */
tentative = false;
@@ -19909,8 +19909,11 @@ cp_parser_placeholder_type_specifier (cp_parser *parser, location_t loc,
if (!flag_concepts_ts
|| !processing_template_parmlist)
{
- error_at (loc, "%qE does not constrain a type", DECL_NAME (con));
- inform (DECL_SOURCE_LOCATION (con), "concept defined here");
+ if (!tentative)
+ {
+ error_at (loc, "%qE does not constrain a type", DECL_NAME (con));
+ inform (DECL_SOURCE_LOCATION (con), "concept defined here");
+ }
return error_mark_node;
}
}