diff options
author | Adam Butcher <adam@jessamine.co.uk> | 2014-02-25 03:47:24 +0000 |
---|---|---|
committer | Adam Butcher <abutcher@gcc.gnu.org> | 2014-02-25 03:47:24 +0000 |
commit | 81493f78875ef6e1714d51cb2f3864689835e0e2 (patch) | |
tree | 5d4911d0be0ea6573b033ff26f5357862efa7b19 /gcc | |
parent | 325fefe0464b35ded3747e5a77f1e005562392ee (diff) | |
download | gcc-81493f78875ef6e1714d51cb2f3864689835e0e2.zip gcc-81493f78875ef6e1714d51cb2f3864689835e0e2.tar.gz gcc-81493f78875ef6e1714d51cb2f3864689835e0e2.tar.bz2 |
re PR c++/60065 ([c++1y] ICE with auto parameter pack)
Fix PR c++/60065.
PR c++/60065
* parser.c (cp_parser_direct_declarator): Don't save and
restore num_template_parameter_lists around call to
cp_parser_parameter_declaration_list.
(function_being_declared_is_template_p): New predicate.
(cp_parser_parameter_declaration_list): Use
function_being_declared_is_template_p as predicate for
inspecting current function template parameter list length
rather than num_template_parameter_lists.
PR c++/60065
* g++.dg/cpp1y/pr60065.C: New testcase.
From-SVN: r208106
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/cp/parser.c | 34 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/pr60065.C | 8 |
4 files changed, 46 insertions, 13 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 20589c3..a5f2ec2 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,15 @@ +2014-02-25 Adam Butcher <adam@jessamine.co.uk> + + PR c++/60065 + * parser.c (cp_parser_direct_declarator): Don't save and + restore num_template_parameter_lists around call to + cp_parser_parameter_declaration_list. + (function_being_declared_is_template_p): New predicate. + (cp_parser_parameter_declaration_list): Use + function_being_declared_is_template_p as predicate for + inspecting current function template parameter list length + rather than num_template_parameter_lists. + 2014-02-24 Jason Merrill <jason@redhat.com> PR c++/60146 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index d99dff0..038e853 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -17042,7 +17042,6 @@ cp_parser_direct_declarator (cp_parser* parser, if (!first || dcl_kind != CP_PARSER_DECLARATOR_NAMED) { tree params; - unsigned saved_num_template_parameter_lists; bool is_declarator = false; /* In a member-declarator, the only valid interpretation @@ -17064,22 +17063,11 @@ cp_parser_direct_declarator (cp_parser* parser, parser->in_declarator_p = true; } - /* Inside the function parameter list, surrounding - template-parameter-lists do not apply. */ - saved_num_template_parameter_lists - = parser->num_template_parameter_lists; - parser->num_template_parameter_lists = 0; - begin_scope (sk_function_parms, NULL_TREE); /* Parse the parameter-declaration-clause. */ params = cp_parser_parameter_declaration_clause (parser); - /* Restore saved template parameter lists accounting for implicit - template parameters. */ - parser->num_template_parameter_lists - += saved_num_template_parameter_lists; - /* Consume the `)'. */ cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN); @@ -18128,6 +18116,26 @@ cp_parser_type_specifier_seq (cp_parser* parser, } } +/* Return whether the function currently being declared has an associated + template parameter list. */ + +static bool +function_being_declared_is_template_p (cp_parser* parser) +{ + if (!current_template_parms) + return false; + + if (parser->implicit_template_scope) + return true; + + if (at_class_scope_p () + && TYPE_BEING_DEFINED (current_class_type)) + return parser->num_template_parameter_lists != 0; + + return ((int) parser->num_template_parameter_lists > template_class_depth + (current_class_type)); +} + /* Parse a parameter-declaration-clause. parameter-declaration-clause: @@ -18266,7 +18274,7 @@ cp_parser_parameter_declaration_list (cp_parser* parser, bool *is_error) cp_parameter_declarator *parameter; tree decl = error_mark_node; bool parenthesized_p = false; - int template_parm_idx = (parser->num_template_parameter_lists? + int template_parm_idx = (function_being_declared_is_template_p (parser)? TREE_VEC_LENGTH (INNERMOST_TEMPLATE_PARMS (current_template_parms)) : 0); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e60f382..b05509f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-02-25 Adam Butcher <adam@jessamine.co.uk> + + PR c++/60065 + * g++.dg/cpp1y/pr60065.C: New testcase. + 2014-02-24 Andrey Belevantsev <abel@ispras.ru> PR rtl-optimization/60268 diff --git a/gcc/testsuite/g++.dg/cpp1y/pr60065.C b/gcc/testsuite/g++.dg/cpp1y/pr60065.C new file mode 100644 index 0000000..2aaa1e3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/pr60065.C @@ -0,0 +1,8 @@ +// PR c++/60065 +// { dg-do compile } +// { dg-options "-std=c++1y" } + +template <int> void foo(auto... x); +template <typename> void foo2(auto... x); +template <int> void foo3(auto... x, auto y, auto... z); +template <typename> void foo4(auto... x, auto y, auto... z); |