diff options
author | abutcher <abutcher@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-09-12 21:04:52 +0000 |
---|---|---|
committer | abutcher <abutcher@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-09-12 21:04:52 +0000 |
commit | 37afc90b6dcfc939c55fee6c94a0c1ff0a61b445 (patch) | |
tree | 09aeca39dd9caaa23fee35767bb1452967741f26 /gcc/cp/decl.c | |
parent | 11996e1f2aaf22004d73ce8c18e2a3292044687b (diff) | |
download | gcc-37afc90b6dcfc939c55fee6c94a0c1ff0a61b445.tar.gz |
Support using 'auto' in a function parameter list to introduce an implicit template parameter.
* cp-tree.h (type_uses_auto_or_concept): Declare.
(is_auto_or_concept): Declare.
* decl.c (grokdeclarator): Allow 'auto' parameters in lambdas with
-std=gnu++1y or -std=c++1y or, as a GNU extension, in plain functions.
* type-utils.h: New header defining ...
(find_type_usage): ... this new function based on pt.c (type_uses_auto)
for searching a type tree given a predicate.
* pt.c (type_uses_auto): Reimplement via type-utils.h (find_type_usage).
(is_auto_or_concept): New function.
(type_uses_auto_or_concept): New function.
* parser.h (struct cp_parser): Add fully_implicit_function_template_p.
* parser.c (cp_parser_new): Initialize fully_implicit_function_template_p.
(cp_parser_new): Initialize fully_implicit_function_template_p.
(cp_parser_lambda_expression): Copy and restore value of
fully_implicit_function_template_p as per other parser fields.
(cp_parser_parameter_declaration_list): Count generic
parameters and call ...
(add_implicit_template_parms): ... this new function to synthesize them
with help from type-utils.h (find_type_usage), ...
(tree_type_is_auto_or_concept): ... this new static function and ...
(make_generic_type_name): ... this new static function.
(cp_parser_direct_declarator): Account for implicit template parameters.
(cp_parser_lambda_declarator_opt): Finish fully implicit template if
necessary by calling ...
(finish_fully_implicit_template): ... this new function.
(cp_parser_member_declaration): Likewise.
(cp_parser_function_definition_after_declarator): Likewise.
* Make-lang.in (cp/pt.o): Add dependency on type-utils.h.
(cp/parser.o): Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@202540 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cp/decl.c')
-rw-r--r-- | gcc/cp/decl.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index b4223aa5706..6e026b2e016 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -10320,8 +10320,23 @@ grokdeclarator (const cp_declarator *declarator, if (type_uses_auto (type)) { - error ("parameter declared %<auto%>"); - type = error_mark_node; + if (current_class_type && LAMBDA_TYPE_P (current_class_type)) + { + if (cxx_dialect < cxx1y) + pedwarn (location_of (type), 0, + "use of %<auto%> in lambda parameter declaration " + "only available with " + "-std=c++1y or -std=gnu++1y"); + } + else if (cxx_dialect < cxx1y) + pedwarn (location_of (type), 0, + "use of %<auto%> in parameter declaration " + "only available with " + "-std=c++1y or -std=gnu++1y"); + else + pedwarn (location_of (type), OPT_Wpedantic, + "ISO C++ forbids use of %<auto%> in parameter " + "declaration"); } /* A parameter declared as an array of T is really a pointer to T. |