]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
pt.c (check_explicit_specialization): Don't abort on bogus explicit instantiations.
authorMark Mitchell <mark@markmitchell.com>
Mon, 17 Aug 1998 09:07:26 +0000 (09:07 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Mon, 17 Aug 1998 09:07:26 +0000 (09:07 +0000)
* pt.c (check_explicit_specialization): Don't abort on bogus
explicit instantiations.

From-SVN: r21780

gcc/cp/ChangeLog
gcc/cp/pt.c

index ad847f4b839284a605ac5fea2e7e4dbd56ec637f..c0b985cdbe4ad2f0bc534d5a78ab90eecfba5622 100644 (file)
@@ -1,3 +1,8 @@
+1998-08-17  Mark Mitchell  <mark@markmitchell.com>
+
+       * pt.c (check_explicit_specialization): Don't abort on bogus
+       explicit instantiations.
+
 1998-08-14  Jason Merrill  <jason@yorick.cygnus.com>
 
        * rtti.c (get_tinfo_fn): Don't mess with the context for now.
index 9c724314ccfaba37d715d2bf437bb3c4419725a8..5c65140cbe7bd35d87a7e42cd910be0535324f74 100644 (file)
@@ -1107,19 +1107,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