From 2aaf816dad783f6cfccae11e356a5213a2455adf Mon Sep 17 00:00:00 2001
From: Jason Merrill <jason@yorick.cygnus.com>
Date: Thu, 19 Aug 1999 21:19:37 +0000
Subject: [PATCH] cp-tree.h: Declare flag_use_repository.

	* 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 | 13 +++++++++++++
 gcc/cp/cp-tree.h |  4 ++++
 gcc/cp/decl2.c   |  7 +++++--
 gcc/cp/pt.c      | 35 ++++++++++++++++++-----------------
 4 files changed, 40 insertions(+), 19 deletions(-)

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 443cdd5e9315..f595a7c0c3a5 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 905a6595e456..8242639799e0 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -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;
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index ecfdd61e695f..ea4dd36bfee0 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -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)
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index e1e8ab435cc6..5560beb8f12a 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -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))
-- 
GitLab