From 2f9afd51aab933f9a70393023a98282698485209 Mon Sep 17 00:00:00 2001 From: Kriang Lerdsuwanakij Date: Mon, 29 Dec 2003 10:16:32 +0000 Subject: [PATCH] re PR c++/12403 (ICE in push_template_decl_real on member function template specialization) PR c++/12403 * parser.c (cp_parser_template_declaration_after_export): Set up template specialization scope in case of explicit specialization. * g++.dg/parse/explicit1.C: New test. * g++.old-deja/g++.pt/explicit71.C: Adjust expected error. From-SVN: r75199 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/parser.c | 12 ++++++++---- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/g++.dg/parse/explicit1.C | 11 +++++++++++ gcc/testsuite/g++.old-deja/g++.pt/explicit71.C | 2 +- 5 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/parse/explicit1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 62e395a007a..1cceeb84435 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2003-12-29 Kriang Lerdsuwanakij + + PR c++/12403 + * parser.c (cp_parser_template_declaration_after_export): Set up + template specialization scope in case of explicit specialization. + 2003-12-28 Mark Mitchell PR c++/13081 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index eae46cf81ea..46907ecb5bb 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -13961,19 +13961,23 @@ cp_parser_template_declaration_after_export (cp_parser* parser, bool member_p) if (!cp_parser_require (parser, CPP_LESS, "`<'")) return; - /* Parse the template parameters. */ - begin_template_parm_list (); /* If the next token is `>', then we have an invalid specialization. Rather than complain about an invalid template parameter, issue an error message here. */ if (cp_lexer_next_token_is (parser->lexer, CPP_GREATER)) { cp_parser_error (parser, "invalid explicit specialization"); + begin_specialization (); parameter_list = NULL_TREE; } else - parameter_list = cp_parser_template_parameter_list (parser); - parameter_list = end_template_parm_list (parameter_list); + { + /* Parse the template parameters. */ + begin_template_parm_list (); + parameter_list = cp_parser_template_parameter_list (parser); + parameter_list = end_template_parm_list (parameter_list); + } + /* Look for the `>'. */ cp_parser_skip_until_found (parser, CPP_GREATER, "`>'"); /* We just processed one more parameter list. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index bfca531f3ad..14faa0dc215 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2003-12-29 Kriang Lerdsuwanakij + + PR c++/12403 + * g++.dg/parse/explicit1.C: New test. + * g++.old-deja/g++.pt/explicit71.C: Adjust expected error. + 2003-12-28 Mark Mitchell PR c++/13081 diff --git a/gcc/testsuite/g++.dg/parse/explicit1.C b/gcc/testsuite/g++.dg/parse/explicit1.C new file mode 100644 index 00000000000..ced2adc3dc0 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/explicit1.C @@ -0,0 +1,11 @@ +// { dg-do compile } + +// Origin: stefaandr@hotmail.com + +// PR c++/12403: ICE when explicit specialization is not in +// namespace scope. + +struct foo { + template void bar (T &t) {} + template<> void bar(double &t) {} // { dg-error "explicit|non-namespace|member" } +}; diff --git a/gcc/testsuite/g++.old-deja/g++.pt/explicit71.C b/gcc/testsuite/g++.old-deja/g++.pt/explicit71.C index 25ba9ff564c..03b879433b5 100644 --- a/gcc/testsuite/g++.old-deja/g++.pt/explicit71.C +++ b/gcc/testsuite/g++.old-deja/g++.pt/explicit71.C @@ -12,4 +12,4 @@ class bug { }; template template <> // { dg-error "" } invalid specialization -class bug::a {}; +class bug::a {}; // { dg-error "" } -- 2.30.2