aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@yorick.cygnus.com>1999-08-19 21:19:37 +0000
committerJason Merrill <jason@gcc.gnu.org>1999-08-19 17:19:37 -0400
commit2aaf816dad783f6cfccae11e356a5213a2455adf (patch)
treed3d47f38708d7d504af6d6c23db5457fef169134 /gcc
parent607eef6e92d2fcd08870fc7e6cc8addcef967841 (diff)
downloadgcc-2aaf816dad783f6cfccae11e356a5213a2455adf.zip
gcc-2aaf816dad783f6cfccae11e356a5213a2455adf.tar.gz
gcc-2aaf816dad783f6cfccae11e356a5213a2455adf.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog13
-rw-r--r--gcc/cp/cp-tree.h4
-rw-r--r--gcc/cp/decl2.c7
-rw-r--r--gcc/cp/pt.c35
4 files changed, 40 insertions, 19 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 443cdd5..f595a7c 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 905a659..8242639 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 ecfdd61..ea4dd36 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 e1e8ab4..5560beb 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))