re PR c++/12403 (ICE in push_template_decl_real on member function template specializ...
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
Mon, 29 Dec 2003 10:16:32 +0000 (10:16 +0000)
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>
Mon, 29 Dec 2003 10:16:32 +0000 (10:16 +0000)
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
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/explicit1.C [new file with mode: 0644]
gcc/testsuite/g++.old-deja/g++.pt/explicit71.C

index 62e395a007a26ece59ca42547cab4be12969e920..1cceeb84435da6a709dbb5eda292c71271d101ae 100644 (file)
@@ -1,3 +1,9 @@
+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
index eae46cf81ea95dbedde132e7ac94e9341b348fa4..46907ecb5bbf7c7a922d6b7b862ad366e3132631 100644 (file)
@@ -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.  */
index bfca531f3aded604da5e50b33c33c24ded8b9a56..14faa0dc2151ad76f2221c3c4c5347e765875fdd 100644 (file)
@@ -1,3 +1,9 @@
+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
diff --git a/gcc/testsuite/g++.dg/parse/explicit1.C b/gcc/testsuite/g++.dg/parse/explicit1.C
new file mode 100644 (file)
index 0000000..ced2adc
--- /dev/null
@@ -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<typename T> void bar (T &t) {}
+        template<> void bar<double>(double &t) {} // { dg-error "explicit|non-namespace|member" }
+};
index 25ba9ff564c20953542ba6d1ee73a9668eb60711..03b879433b5890f2d4c704efb030f7616907b494 100644 (file)
@@ -12,4 +12,4 @@ class bug {
 };
 template <class X> 
 template <>                    // { dg-error "" } invalid specialization
-class bug<X>::a<char> {};      
+class bug<X>::a<char> {};      // { dg-error "" }