From 67ff2e85dc4506e8a3f9a60ce20db8eeb9c8a64e Mon Sep 17 00:00:00 2001 From: geoffk Date: Mon, 24 May 2004 21:07:42 +0000 Subject: [PATCH] * method.c (implicitly_declare_fn): Don't call defer_fn; abort if it might be needed. * pt.c (mark_decl_instantiated): Only call defer_fn if the function actually needs processing in finish_file. * decl2.c (finish_file): Add check that elements in deferred_fns_used are really needed there. Remove unnecessary test of DECL_SAVED_TREE. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@82217 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 10 ++++++++++ gcc/cp/decl2.c | 10 +++++++--- gcc/cp/method.c | 3 ++- gcc/cp/pt.c | 4 +++- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 34db8d64712..b2792808dbc 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +2004-05-24 Geoffrey Keating + + * method.c (implicitly_declare_fn): Don't call defer_fn; abort + if it might be needed. + * pt.c (mark_decl_instantiated): Only call defer_fn if + the function actually needs processing in finish_file. + * decl2.c (finish_file): Add check that elements in + deferred_fns_used are really needed there. Remove unnecessary + test of DECL_SAVED_TREE. + 2004-05-23 Paolo Bonzini * Make-lang.in: No need to specify $(LIBCPP). diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index dfe4b0d2e28..7f9e000f663 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -2749,9 +2749,14 @@ finish_file (void) calling import_export_decl will make an inline template instantiation "static", which will result in errors about the use of undefined functions if there is no body for - the function. */ + the function. In fact, all the functions in this list + *should* have a body. */ if (!DECL_SAVED_TREE (decl)) - continue; + { + if (! DECL_DECLARED_INLINE_P (decl) || ! TREE_USED (decl)) + abort (); + continue; + } import_export_decl (decl); @@ -2776,7 +2781,6 @@ finish_file (void) gotten around to synthesizing yet.) */ if (!DECL_EXTERNAL (decl) && DECL_NEEDED_P (decl) - && DECL_SAVED_TREE (decl) && !TREE_ASM_WRITTEN (decl) && (!flag_unit_at_a_time || !cgraph_node (decl)->local.finalized)) diff --git a/gcc/cp/method.c b/gcc/cp/method.c index efd0e06269c..4920c541152 100644 --- a/gcc/cp/method.c +++ b/gcc/cp/method.c @@ -1027,7 +1027,8 @@ implicitly_declare_fn (special_function_kind kind, tree type, bool const_p) DECL_NOT_REALLY_EXTERN (fn) = 1; DECL_DECLARED_INLINE_P (fn) = 1; DECL_INLINE (fn) = 1; - defer_fn (fn); + if (TREE_USED (fn)) + abort (); return fn; } diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 38c91a0e188..14a6788cc27 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -10161,7 +10161,9 @@ mark_decl_instantiated (tree result, int extern_p) maybe_make_one_only (result); } - if (TREE_CODE (result) == FUNCTION_DECL) + if (TREE_CODE (result) == FUNCTION_DECL + && (DECL_ARTIFICIAL (result) + || (DECL_DECLARED_INLINE_P (result) && TREE_USED (result)))) defer_fn (result); } -- 2.11.4.GIT