diff options
author | Jason Merrill <jason@redhat.com> | 2023-06-08 19:31:18 -0400 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2023-06-09 11:41:42 -0400 |
commit | d3e2a174b13dd06e63abdb89f3b3040731a73aff (patch) | |
tree | 26d2d517580b4e4ebc7a753303d579ed7a66628b /gcc | |
parent | 35d2c40e4ac9ba57ae82e4722e557a2028d0cf13 (diff) | |
download | gcc-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.cc | 17 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/concepts/auto7.C | 9 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/concepts/auto7a.C | 8 |
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>()); +} |