diff options
author | Paolo Carlini <paolo@gcc.gnu.org> | 2012-10-25 09:12:22 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2012-10-25 09:12:22 +0000 |
commit | 3a969a32ff392ed49a60050a8b94d1dfdc05a5f3 (patch) | |
tree | 5860e18219756b6ce39469e5066e212b60843bec | |
parent | dc3e0b5501f77047714af927089bd4538a613440 (diff) | |
download | gcc-3a969a32ff392ed49a60050a8b94d1dfdc05a5f3.zip gcc-3a969a32ff392ed49a60050a8b94d1dfdc05a5f3.tar.gz gcc-3a969a32ff392ed49a60050a8b94d1dfdc05a5f3.tar.bz2 |
re PR c++/34892 (ICE with ellipsis in default template argument)
/cp
2012-10-25 Paolo Carlini <paolo.carlini@oracle.com>
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.
/testsuite
2012-10-25 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/34892
* g++.dg/template/crash114.C: New.
From-SVN: r192802
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/parser.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/crash114.C | 5 |
4 files changed, 30 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9e8d933..9d5dde7 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2012-10-25 Paolo Carlini <paolo.carlini@oracle.com> + + 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 <paolo.carlini@oracle.com> PR c++/54922 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 853d789..9403563 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 b41a4dc..bcbc0f2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,7 +1,12 @@ +2012-10-25 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/34892 + * g++.dg/template/crash114.C: New. + 2012-10-24 H.J. Lu <hongjiu.lu@intel.com> PR bootstrap/55049 - * gcc.target/i386/pr55049-1.c: New test. + * gcc.target/i386/pr55049-1.c: New test. 2012-10-24 Janus Weil <janus@gcc.gnu.org> diff --git a/gcc/testsuite/g++.dg/template/crash114.C b/gcc/testsuite/g++.dg/template/crash114.C new file mode 100644 index 0000000..cf894ba --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash114.C @@ -0,0 +1,5 @@ +// PR c++/34892 + +template<int=..., int=0> struct A {}; // { dg-error "expected primary" } + +A<0> a; |