From 81fdaa176d937936a21bb3e42eb482f042f42b77 Mon Sep 17 00:00:00 2001 From: Adam Butcher Date: Mon, 6 Jan 2014 18:22:29 +0000 Subject: [PATCH] re PR c++/59636 ([c++1y] ICE with missing template parameter in lambda) Fix PR c++/59636 PR c++/59636 * cp/parser.c (cp_parser_template_parameter): Early out with error_mark_node if parameter declaration was not parsed. * g++.dg/cpp1y/pr59636.C: New testcase. From-SVN: r206369 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/parser.c | 12 ++++++------ gcc/testsuite/ChangeLog | 2 ++ gcc/testsuite/g++.dg/cpp1y/pr59636.C | 7 +++++++ 4 files changed, 19 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp1y/pr59636.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3bc68fc..3322897 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -4,6 +4,10 @@ * cp/lambda.c (maybe_add_lambda_conv_op): Handle marking conversion function as unimplemented for generic lambdas with varargs. + PR c++/59636 + * cp/parser.c (cp_parser_template_parameter): Early out with + error_mark_node if parameter declaration was not parsed. + 2014-01-03 Marc Glisse PR c++/58950 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index c99c1fc..4d97026 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -12977,20 +12977,21 @@ cp_parser_template_parameter (cp_parser* parser, bool *is_non_type, = cp_parser_parameter_declaration (parser, /*template_parm_p=*/true, /*parenthesized_p=*/NULL); + if (!parameter_declarator) + return error_mark_node; + /* If the parameter declaration is marked as a parameter pack, set *IS_PARAMETER_PACK to notify the caller. Also, unmark the declarator's PACK_EXPANSION_P, otherwise we'll get errors from grokdeclarator. */ - if (parameter_declarator - && parameter_declarator->declarator + if (parameter_declarator->declarator && parameter_declarator->declarator->parameter_pack_p) { *is_parameter_pack = true; parameter_declarator->declarator->parameter_pack_p = false; } - if (parameter_declarator - && parameter_declarator->default_argument) + if (parameter_declarator->default_argument) { /* Can happen in some cases of erroneous input (c++/34892). */ if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS)) @@ -13014,8 +13015,7 @@ cp_parser_template_parameter (cp_parser* parser, bool *is_non_type, /* We might end up with a pack expansion as the type of the non-type template parameter, in which case this is a non-type template parameter pack. */ - else if (parameter_declarator - && parameter_declarator->decl_specifiers.type + else if (parameter_declarator->decl_specifiers.type && PACK_EXPANSION_P (parameter_declarator->decl_specifiers.type)) { *is_parameter_pack = true; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f0c4804..a56b69d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,7 +1,9 @@ 2014-01-06 Adam Butcher PR c++/59635 + PR c++/59636 * g++.dg/cpp1y/pr59635.C: New testcase. + * g++.dg/cpp1y/pr59636.C: New testcase. 2014-01-06 Martin Jambor diff --git a/gcc/testsuite/g++.dg/cpp1y/pr59636.C b/gcc/testsuite/g++.dg/cpp1y/pr59636.C new file mode 100644 index 0000000..f2ca5b6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/pr59636.C @@ -0,0 +1,7 @@ +// { dg-do compile } +// { dg-options "-std=c++1y" } + +// PR c++/59636 + +auto f = []() { return []<>() {}; }; // { dg-error "expected identifier" } + -- 2.7.4