aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/parser.c9
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/crash38.C10
-rw-r--r--gcc/testsuite/g++.dg/parse/explicit1.C2
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" }
};