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
This commit is contained in:
parent
607eef6e92
commit
2aaf816dad
@ -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.
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
35
gcc/cp/pt.c
35
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))
|
||||
|
Loading…
Reference in New Issue
Block a user