aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2022-03-30 09:16:41 +0200
committerJakub Jelinek <jakub@redhat.com>2022-03-30 09:16:41 +0200
commit4f2795218a6ba6a7b7b9b18ca7a6e390661e1608 (patch)
tree17d8eaeb7f5ed3b9a63d5bc09270e1d125fd847f /gcc
parentd8e91994bad073b713f2b47bc6171f3a4e422562 (diff)
downloadgcc-4f2795218a6ba6a7b7b9b18ca7a6e390661e1608.zip
gcc-4f2795218a6ba6a7b7b9b18ca7a6e390661e1608.tar.gz
gcc-4f2795218a6ba6a7b7b9b18ca7a6e390661e1608.tar.bz2
c++: Fox template-introduction tentative parsing in class bodies clear colon_corrects_to_scope_p [PR105061]
The concepts support (in particular template introductions from concepts TS) broke the following testcase, valid unnamed bitfields with dependent types (or even just typedefs) were diagnosed as typos (: instead of correct ::) in template introduction during their tentative parsing. The following patch fixes that by not doing this : to :: correction when member_p is true. 2022-03-30 Jakub Jelinek <jakub@redhat.com> PR c++/105061 * parser.cc (cp_parser_template_introduction): If member_p, temporarily clear parser->colon_corrects_to_scope_p around tentative parsing of nested name specifier. * g++.dg/concepts/pr105061.C: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/parser.cc7
-rw-r--r--gcc/testsuite/g++.dg/concepts/pr105061.C13
2 files changed, 20 insertions, 0 deletions
diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index d3c22ee..7e1c777 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -31417,9 +31417,15 @@ cp_parser_template_introduction (cp_parser* parser, bool member_p)
tree saved_scope = parser->scope;
tree saved_object_scope = parser->object_scope;
tree saved_qualifying_scope = parser->qualifying_scope;
+ bool saved_colon_corrects_to_scope_p = parser->colon_corrects_to_scope_p;
cp_token *start_token = cp_lexer_peek_token (parser->lexer);
+ /* In classes don't parse valid unnamed bitfields as invalid
+ template introductions. */
+ if (member_p)
+ parser->colon_corrects_to_scope_p = false;
+
/* Look for the optional `::' operator. */
cp_parser_global_scope_opt (parser,
/*current_scope_valid_p=*/false);
@@ -31440,6 +31446,7 @@ cp_parser_template_introduction (cp_parser* parser, bool member_p)
parser->scope = saved_scope;
parser->object_scope = saved_object_scope;
parser->qualifying_scope = saved_qualifying_scope;
+ parser->colon_corrects_to_scope_p = saved_colon_corrects_to_scope_p;
if (concept_name == error_mark_node
|| (seen_error () && !concept_definition_p (tmpl_decl)))
diff --git a/gcc/testsuite/g++.dg/concepts/pr105061.C b/gcc/testsuite/g++.dg/concepts/pr105061.C
new file mode 100644
index 0000000..3f6f0e4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/concepts/pr105061.C
@@ -0,0 +1,13 @@
+// PR c++/105061
+
+template <typename T, int U, int V>
+struct A { T : V, u : U; };
+template <int U, int V>
+struct B { unsigned : V, u : U; };
+typedef unsigned uns;
+template <int U, int V>
+struct C { uns : V, u : U; };
+
+A<unsigned int, 4, 5> a = { 13 };
+B<5, 6> b = { 26 };
+C<8, 9> c = { 42 };