From e1fea4ff629e55ffa34b5c8782a08377cf221a32 Mon Sep 17 00:00:00 2001 From: Josh Conner Date: Fri, 28 Oct 2005 18:47:28 +0000 Subject: [PATCH] backport: re PR c++/22153 (ICE on invalid template specialization) Merged from mainline change #105944: PR c++/22153 * cp/parser.c (cp_parser_member_declaration): Detect and handle a template specialization. * testsuite/g++.dg/template/crash38.C: New test. * testsuite/g++.dg/parse/explicit1.C: Change expected errors. From-SVN: r105946 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/parser.c | 9 +++++++-- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/g++.dg/crash38.C | 10 ++++++++++ gcc/testsuite/g++.dg/parse/explicit1.C | 2 +- 5 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/crash38.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index dee049b315e1..4f7b178d4185 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2005-10-28 Josh Conner + + PR c++/22153 + * parser.c (cp_parser_member_declaration): Detect and handle + a template specialization. + 2005-10-20 Volker Reichelt PR c++/22508 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 198fe79f3845..03c9f589ce5b 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -12518,8 +12518,13 @@ cp_parser_member_declaration (cp_parser* parser) /* Check for a template-declaration. */ if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TEMPLATE)) { - /* Parse the template-declaration. */ - cp_parser_template_declaration (parser, /*member_p=*/true); + /* An explicit specialization here is an error condition, and we + expect the specialization handler to detect and report this. */ + if (cp_lexer_peek_nth_token (parser->lexer, 2)->type == CPP_LESS + && cp_lexer_peek_nth_token (parser->lexer, 3)->type == CPP_GREATER) + cp_parser_explicit_specialization (parser); + else + cp_parser_template_declaration (parser, /*member_p=*/true); return; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7b6905a9290e..3676223f86b3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2005-10-28 Josh Conner + + PR c++/22153 + * g++.dg/template/crash38.C: New test. + * g++.dg/parse/explicit1.C: Change expected errors. + 2005-10-21 Eric Botcazou * gcc.c-torture/execute/20051021-1.c: New test. diff --git a/gcc/testsuite/g++.dg/crash38.C b/gcc/testsuite/g++.dg/crash38.C new file mode 100644 index 000000000000..d36ced473abf --- /dev/null +++ b/gcc/testsuite/g++.dg/crash38.C @@ -0,0 +1,10 @@ +// { dg-do compile } + +// PR c++/22153 + +template void foo(); + +template struct A +{ + template<> friend void foo<0>(); // { dg-error "" } +}; diff --git a/gcc/testsuite/g++.dg/parse/explicit1.C b/gcc/testsuite/g++.dg/parse/explicit1.C index ced2adc3dc09..35358749e1d0 100644 --- a/gcc/testsuite/g++.dg/parse/explicit1.C +++ b/gcc/testsuite/g++.dg/parse/explicit1.C @@ -7,5 +7,5 @@ struct foo { template void bar (T &t) {} - template<> void bar(double &t) {} // { dg-error "explicit|non-namespace|member" } + template<> void bar(double &t) {} // { dg-error "non-namespace|template|function" } }; -- 2.47.2