cp-tree.h: Declare flag_use_repository.
authorJason Merrill <jason@yorick.cygnus.com>
Thu, 19 Aug 1999 21:19:37 +0000 (21:19 +0000)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 19 Aug 1999 21:19:37 +0000 (17:19 -0400)
* cp-tree.h: Declare flag_use_repository.
* pt.c (do_decl_instantiation): Don't complain about duplicate
instantiation with -frepo.
(do_type_instantiation): Likewise.

* pt.c (push_template_decl_real): Complain about everything
that isn't a valid template.

* decl2.c (import_export_decl): If -fnew-abi, class linkage doesn't
affect inlines.

From-SVN: r28767

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/decl2.c
gcc/cp/pt.c

index 443cdd5e9315d8c3a22cfca9d5e814b0dad5c192..f595a7c0c3a51e3a3356bc29b518ff39b0a478cc 100644 (file)
@@ -1,3 +1,16 @@
+1999-08-19  Jason Merrill  <jason@yorick.cygnus.com>
+
+       * cp-tree.h: Declare flag_use_repository.
+       * pt.c (do_decl_instantiation): Don't complain about duplicate
+       instantiation with -frepo.
+       (do_type_instantiation): Likewise.
+
+       * pt.c (push_template_decl_real): Complain about everything
+       that isn't a valid template.
+
+       * decl2.c (import_export_decl): If -fnew-abi, class linkage doesn't
+       affect inlines.
+
 1999-08-19  Mark Mitchell  <mark@codesourcery.com>
 
        * cp-tree.def (PSEUDO_DTOR_EXPR): New tree code.
index 905a6595e4561b2322ab240bd20cca7b6b55d5b6..8242639799e004d4559a6917e85dd5a571e0fd04 100644 (file)
@@ -594,6 +594,10 @@ extern int flag_guiding_decls;
    and class qualifiers.       */
 extern int flag_do_squangling;
 
+/* Nonzero means generate separate instantiation control files and juggle
+   them at link time.  */
+extern int flag_use_repository;
+
 /* Nonzero if we want to issue diagnostics that the standard says are not
    required.  */
 extern int flag_optional_diags;
index ecfdd61e695f8dcec77be82001adfe8b441e4061..ea4dd36bfee071df83d8953bf452fc2a48225674 100644 (file)
@@ -232,7 +232,8 @@ int warn_ctor_dtor_privacy = 1;
 #endif
 int flag_vtable_thunks = DEFAULT_VTABLE_THUNKS;
 
-/* True if we want to deal with repository information.  */
+/* Nonzero means generate separate instantiation control files and juggle
+   them at link time.  */
 
 int flag_use_repository;
 
@@ -2722,7 +2723,9 @@ import_export_decl (decl)
       tree ctype = DECL_CLASS_CONTEXT (decl);
       import_export_class (ctype);
       if (CLASSTYPE_INTERFACE_KNOWN (ctype)
-         && (! DECL_ARTIFICIAL (decl) || DECL_VINDEX (decl)))
+         && (flag_new_abi
+             ? (! DECL_THIS_INLINE (decl))
+             : (! DECL_ARTIFICIAL (decl) || DECL_VINDEX (decl))))
        {
          DECL_NOT_REALLY_EXTERN (decl)
            = ! (CLASSTYPE_INTERFACE_ONLY (ctype)
index e1e8ab435cc6b3e9a6852c2119ed959ea63312d2..5560beb8f12a5c0d2a5b29a21e67f880d4274854 100644 (file)
@@ -2424,11 +2424,12 @@ push_template_decl_real (decl, is_friend)
       else if (TREE_CODE (decl) == TYPE_DECL 
               && ANON_AGGRNAME_P (DECL_NAME (decl))) 
        cp_error ("template class without a name");
-      else if (TREE_CODE (decl) == TYPE_DECL 
-         && TREE_CODE (TREE_TYPE (decl)) == ENUMERAL_TYPE)
-       cp_error ("template declaration of `%#T'", TREE_TYPE (decl));
-      else if (TREE_CODE (decl) == VAR_DECL
-              && !CLASS_TYPE_P (CP_DECL_CONTEXT (decl)))
+      else if ((DECL_IMPLICIT_TYPEDEF_P (decl)
+               && CLASS_TYPE_P (TREE_TYPE (decl)))
+              || (TREE_CODE (decl) == VAR_DECL && ctx && CLASS_TYPE_P (ctx))
+              || TREE_CODE (decl) == FUNCTION_DECL)
+       /* OK */;
+      else
        cp_error ("template declaration of `%#D'", decl);
     }
 
@@ -2582,9 +2583,7 @@ push_template_decl_real (decl, is_friend)
          && TREE_CODE (TREE_TYPE (decl)) != ENUMERAL_TYPE)
        DECL_NAME (decl) = classtype_mangled_name (TREE_TYPE (decl));
     }
-  else if (! DECL_LANG_SPECIFIC (decl))
-    cp_error ("template declaration of `%#D'", decl);
-  else
+  else if (DECL_LANG_SPECIFIC (decl))
     DECL_TEMPLATE_INFO (decl) = info;
 
   return DECL_TEMPLATE_RESULT (tmpl);
@@ -9166,10 +9165,11 @@ do_decl_instantiation (declspecs, declarator, storage)
         No program shall explicitly instantiate any template more
         than once.  
 
-        We check DECL_INTERFACE_KNOWN so as not to complain when the
-        first instantiation was `extern' and the second is not, and
-        EXTERN_P for the opposite case.  */
-      if (DECL_INTERFACE_KNOWN (result) && !extern_p)
+        We check DECL_INTERFACE_KNOWN so as not to complain when the first
+        instantiation was `extern' and the second is not, and EXTERN_P for
+        the opposite case.  If -frepo, chances are we already got marked
+        as an explicit instantion because of the repo file.  */
+      if (DECL_INTERFACE_KNOWN (result) && !extern_p && !flag_use_repository)
        cp_pedwarn ("duplicate explicit instantiation of `%#D'", result);
 
       /* If we've already instantiated the template, just return now.  */
@@ -9294,11 +9294,12 @@ do_type_instantiation (t, storage)
         No program shall explicitly instantiate any template more
         than once.  
 
-         If CLASSTYPE_INTERFACE_ONLY, then the first explicit
-        instantiation was `extern', and if EXTERN_P then the second
-        is.  Both cases are OK.  */
-      if (!CLASSTYPE_INTERFACE_ONLY (t) && !extern_p)
-       cp_error ("duplicate explicit instantiation of `%#T'", t);
+         If CLASSTYPE_INTERFACE_ONLY, then the first explicit instantiation
+        was `extern'.  If EXTERN_P then the second is.  If -frepo, chances
+        are we already got marked as an explicit instantion because of the
+        repo file.  All these cases are OK.  */
+      if (!CLASSTYPE_INTERFACE_ONLY (t) && !extern_p && !flag_use_repository)
+       cp_pedwarn ("duplicate explicit instantiation of `%#T'", t);
       
       /* If we've already instantiated the template, just return now.  */
       if (!CLASSTYPE_INTERFACE_ONLY (t))