diff options
author | Jason Merrill <jason@yorick.cygnus.com> | 1999-08-19 21:19:37 +0000 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 1999-08-19 17:19:37 -0400 |
commit | 2aaf816dad783f6cfccae11e356a5213a2455adf (patch) | |
tree | d3d47f38708d7d504af6d6c23db5457fef169134 /gcc | |
parent | 607eef6e92d2fcd08870fc7e6cc8addcef967841 (diff) | |
download | gcc-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/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 4 | ||||
-rw-r--r-- | gcc/cp/decl2.c | 7 | ||||
-rw-r--r-- | gcc/cp/pt.c | 35 |
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)) |