+2003-12-29 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+ 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 <mark@codesourcery.com>
PR c++/13081
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. */
+2003-12-29 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+
+ 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 <mark@codesourcery.com>
PR c++/13081
--- /dev/null
+// { dg-do compile }
+
+// Origin: stefaandr@hotmail.com
+
+// PR c++/12403: ICE when explicit specialization is not in
+// namespace scope.
+
+struct foo {
+ template<typename T> void bar (T &t) {}
+ template<> void bar<double>(double &t) {} // { dg-error "explicit|non-namespace|member" }
+};