diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/parser.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/crash38.C | 10 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/explicit1.C | 2 |
5 files changed, 30 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d2ec158..fed864d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2005-10-28 Josh Conner <jconner@apple.com> + + PR c++/22153 + * parser.c (cp_parser_member_declaration): Detect and handle + a template specialization. + 2005-10-28 Andrew Pinski <pinskia@physics.uc.edu> PR C++/23426 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 25f25ce..a065c25 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -13240,8 +13240,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 bd5ff26..85a10d8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2005-10-28 Josh Conner <jconner@apple.com> + + PR c++/22153 + * g++.dg/template/crash38.C: New test. + * g++.dg/parse/explicit1.C: Change expected errors. + 2005-10-28 Andrew Pinski <pinskia@physics.uc.edu> PR C++/23426 diff --git a/gcc/testsuite/g++.dg/crash38.C b/gcc/testsuite/g++.dg/crash38.C new file mode 100644 index 0000000..d36ced4 --- /dev/null +++ b/gcc/testsuite/g++.dg/crash38.C @@ -0,0 +1,10 @@ +// { dg-do compile } + +// PR c++/22153 + +template<int> void foo(); + +template<int> 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 ced2adc..3535874 100644 --- a/gcc/testsuite/g++.dg/parse/explicit1.C +++ b/gcc/testsuite/g++.dg/parse/explicit1.C @@ -7,5 +7,5 @@ struct foo { template<typename T> void bar (T &t) {} - template<> void bar<double>(double &t) {} // { dg-error "explicit|non-namespace|member" } + template<> void bar<double>(double &t) {} // { dg-error "non-namespace|template|function" } }; |