diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9e8d933e745..9d5dde7ba92 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2012-10-25 Paolo Carlini + + PR c++/34892 + * parser.c (cp_parser_template_parameter): When + cp_parser_parameter_declaration parsed a default argument don't + see if *is_parameter_pack needs setting. + 2012-10-23 Paolo Carlini PR c++/54922 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 853d789f987..940356377a0 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -12258,12 +12258,21 @@ cp_parser_template_parameter (cp_parser* parser, bool *is_non_type, parameter_declarator->declarator->parameter_pack_p = false; } + if (parameter_declarator + && parameter_declarator->default_argument) + { + /* Can happen in some cases of erroneous input (c++/34892). */ + if (cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS)) + /* Consume the `...' for better error recovery. */ + cp_lexer_consume_token (parser->lexer); + } /* If the next token is an ellipsis, and we don't already have it marked as a parameter pack, then we have a parameter pack (that has no declarator). */ - if (!*is_parameter_pack - && cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS) - && declarator_can_be_parameter_pack (parameter_declarator->declarator)) + else if (!*is_parameter_pack + && cp_lexer_next_token_is (parser->lexer, CPP_ELLIPSIS) + && (declarator_can_be_parameter_pack + (parameter_declarator->declarator))) { /* Consume the `...'. */ cp_lexer_consume_token (parser->lexer); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b41a4dce82d..bcbc0f28c83 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,7 +1,12 @@ +2012-10-25 Paolo Carlini + + PR c++/34892 + * g++.dg/template/crash114.C: New. + 2012-10-24 H.J. Lu PR bootstrap/55049 - * gcc.target/i386/pr55049-1.c: New test. + * gcc.target/i386/pr55049-1.c: New test. 2012-10-24 Janus Weil diff --git a/gcc/testsuite/g++.dg/template/crash114.C b/gcc/testsuite/g++.dg/template/crash114.C new file mode 100644 index 00000000000..cf894ba6967 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash114.C @@ -0,0 +1,5 @@ +// PR c++/34892 + +template struct A {}; // { dg-error "expected primary" } + +A<0> a;