aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2023-06-08 19:31:18 -0400
committerJason Merrill <jason@redhat.com>2023-06-09 11:41:42 -0400
commitd3e2a174b13dd06e63abdb89f3b3040731a73aff (patch)
tree26d2d517580b4e4ebc7a753303d579ed7a66628b /gcc
parent35d2c40e4ac9ba57ae82e4722e557a2028d0cf13 (diff)
downloadgcc-d3e2a174b13dd06e63abdb89f3b3040731a73aff.zip
gcc-d3e2a174b13dd06e63abdb89f3b3040731a73aff.tar.gz
gcc-d3e2a174b13dd06e63abdb89f3b3040731a73aff.tar.bz2
c++: diagnose auto in template arg
We were failing to diagnose this Concepts TS feature that didn't make it into C++20 because the 'auto' was getting converted to a template parameter before we checked for it. So also check in cp_parser_simple_type_specifier. The code in cp_parser_template_type_arg that I initially expected to diagnose this seems unreachable because cp_parser_type_id_1 already checks auto. gcc/cp/ChangeLog: * parser.cc (cp_parser_simple_type_specifier): Check for auto in template argument. (cp_parser_template_type_arg): Remove auto checking. gcc/testsuite/ChangeLog: * g++.dg/concepts/auto7.C: New test. * g++.dg/concepts/auto7a.C: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/parser.cc17
-rw-r--r--gcc/testsuite/g++.dg/concepts/auto7.C9
-rw-r--r--gcc/testsuite/g++.dg/concepts/auto7a.C8
3 files changed, 25 insertions, 9 deletions
diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index d77fbd2..09cba71 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -19823,15 +19823,19 @@ cp_parser_simple_type_specifier (cp_parser* parser,
"only available with "
"%<-std=c++14%> or %<-std=gnu++14%>");
}
+ else if (!flag_concepts_ts && parser->in_template_argument_list_p)
+ pedwarn (token->location, 0,
+ "use of %<auto%> in template argument "
+ "only available with %<-fconcepts-ts%>");
+ else if (!flag_concepts)
+ pedwarn (token->location, 0,
+ "use of %<auto%> in parameter declaration "
+ "only available with %<-std=c++20%> or %<-fconcepts%>");
else if (cxx_dialect < cxx14)
error_at (token->location,
"use of %<auto%> in parameter declaration "
"only available with "
"%<-std=c++14%> or %<-std=gnu++14%>");
- else if (!flag_concepts)
- pedwarn (token->location, 0,
- "use of %<auto%> in parameter declaration "
- "only available with %<-std=c++20%> or %<-fconcepts%>");
}
else
type = make_auto ();
@@ -24522,11 +24526,6 @@ cp_parser_template_type_arg (cp_parser *parser)
= G_("types may not be defined in template arguments");
r = cp_parser_type_id_1 (parser, CP_PARSER_FLAGS_NONE, true, false, NULL);
parser->type_definition_forbidden_message = saved_message;
- if (cxx_dialect >= cxx14 && !flag_concepts && type_uses_auto (r))
- {
- error ("invalid use of %<auto%> in template argument");
- r = error_mark_node;
- }
return r;
}
diff --git a/gcc/testsuite/g++.dg/concepts/auto7.C b/gcc/testsuite/g++.dg/concepts/auto7.C
new file mode 100644
index 0000000..3cbf5dd
--- /dev/null
+++ b/gcc/testsuite/g++.dg/concepts/auto7.C
@@ -0,0 +1,9 @@
+// { dg-do compile { target c++14 } }
+// { dg-additional-options -fconcepts-ts }
+
+template <class T> struct A { };
+void f(A<auto> a) { }
+int main()
+{
+ f(A<int>());
+}
diff --git a/gcc/testsuite/g++.dg/concepts/auto7a.C b/gcc/testsuite/g++.dg/concepts/auto7a.C
new file mode 100644
index 0000000..88868f4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/concepts/auto7a.C
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++14 } }
+
+template <class T> struct A { };
+void f(A<auto> a) { } // { dg-error "auto. in template argument" }
+int main()
+{
+ f(A<int>());
+}