pt.c (check_explicit_specialization): Don't abort on bogus explicit instantiations.
authorMark Mitchell <mark@markmitchell.com>
Sun, 9 Aug 1998 15:20:40 +0000 (15:20 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Sun, 9 Aug 1998 15:20:40 +0000 (15:20 +0000)
* pt.c (check_explicit_specialization): Don't abort on bogus
explicit instantiations.

From-SVN: r21643

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.old-deja/g++.pt/explicit69.C

index 4a1c42ab060cee068c743e058c57123b90db7891..a84a1a952b23dc88a6842d2e767d91b8050af501 100644 (file)
@@ -1,3 +1,8 @@
+1998-08-09  Mark Mitchell  <mark@markmitchell.com>
+
+       * pt.c (check_explicit_specialization): Don't abort on bogus
+       explicit instantiations.
+
 1998-08-07  Mark Mitchell  <mark@markmitchell.com>
 
        * typeck.c (require_complete_type): Use complete_type_or_else.
index f664caa9bc60fbbaec26c2de05ce466849da2219..8e0983ece5bb7dcc8ad38c5b67fe148635a063e0 100644 (file)
@@ -1205,19 +1205,33 @@ check_explicit_specialization (declarator, decl, template_count, flags)
 
       if (ctype != NULL_TREE && TYPE_BEING_DEFINED (ctype))
        {
-         /* Since finish_struct_1 has not been called yet, we
-            can't call lookup_fnfields.  We note that this
-            template is a specialization, and proceed, letting
-            finish_struct fix this up later.  */
-         tree ti = perm_tree_cons (NULL_TREE, 
-                                   TREE_OPERAND (declarator, 1),
-                                   NULL_TREE);
-         TI_PENDING_SPECIALIZATION_FLAG (ti) = 1;
-         DECL_TEMPLATE_INFO (decl) = ti;
-         /* This should not be an instantiation; explicit
-            instantiation directives can only occur at the top
-            level.  */
-         my_friendly_assert (!explicit_instantiation, 0);
+         if (!explicit_instantiation)
+           {
+             /* Since finish_struct_1 has not been called yet, we
+                can't call lookup_fnfields.  We note that this
+                template is a specialization, and proceed, letting
+                finish_struct fix this up later.  */
+             tree ti = perm_tree_cons (NULL_TREE, 
+                                       TREE_OPERAND (declarator, 1),
+                                       NULL_TREE);
+             TI_PENDING_SPECIALIZATION_FLAG (ti) = 1;
+             DECL_TEMPLATE_INFO (decl) = ti;
+           }
+         else
+           /* It's not legal to write an explicit instantiation in
+              class scope, e.g.:
+
+                class C { template void f(); }
+
+              This case is caught by the parser.  However, on
+              something like:
+              
+                template class C { void f(); };
+
+              (which is illegal) we can get here.  The error will be
+              issued later.  */
+           ;
+
          return decl;
        }
       else if (ctype != NULL_TREE 
index f42b96d55b29693834652b96b27b78a24a25d2fc..671cf005de5093709baebe7a557d3e1ec3b3d26d 100644 (file)
@@ -1,2 +1,2 @@
 //Build don't link:
-template class x {}; // ERROR - not a template instantiation XFAIL *-*-*
+template class x {}; // ERROR - not a template instantiation