From: jason Date: Mon, 24 Aug 2009 21:32:12 +0000 (+0000) Subject: * decl2.c (mark_used): Streamline logic. X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=b2e9b7542b3ae4526a459d646c7b76a6756f0abf * decl2.c (mark_used): Streamline logic. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@151062 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8c555e6b339..be151df5734 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,4 +1,6 @@ -2009-08-21 Jason Merrill +2009-08-24 Jason Merrill + + * decl2.c (mark_used): Streamline logic. PR c++/41109 PR c++/41110 diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 960ccf019ab..2ef7a5c6a57 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -3865,7 +3865,8 @@ mark_used (tree decl) DECL_LANG_SPECIFIC set, and these are also the only decls that we might need special handling for. */ if ((TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != FUNCTION_DECL) - || DECL_LANG_SPECIFIC (decl) == NULL) + || DECL_LANG_SPECIFIC (decl) == NULL + || DECL_THUNK_P (decl)) return; /* We only want to do this processing once. We don't need to keep trying @@ -3917,22 +3918,17 @@ mark_used (tree decl) o the variable or function is not used (3.2 [basic.def.odr]) or is defined in the same translation unit. */ if (TREE_PUBLIC (decl) - && (TREE_CODE (decl) == FUNCTION_DECL - || TREE_CODE (decl) == VAR_DECL) - && DECL_LANG_SPECIFIC (decl)) - { - if (!DECL_EXTERN_C_P (decl) - && !DECL_ARTIFICIAL (decl) - && !decl_defined_p (decl) - && no_linkage_check (TREE_TYPE (decl), /*relaxed_p=*/false)) - { - if (is_local_extern (decl)) - /* There's no way to define a local extern, and adding it to - the vector interferes with GC, so give an error now. */ - no_linkage_error (decl); - else - VEC_safe_push (tree, gc, no_linkage_decls, decl); - } + && !DECL_EXTERN_C_P (decl) + && !DECL_ARTIFICIAL (decl) + && !decl_defined_p (decl) + && no_linkage_check (TREE_TYPE (decl), /*relaxed_p=*/false)) + { + if (is_local_extern (decl)) + /* There's no way to define a local extern, and adding it to + the vector interferes with GC, so give an error now. */ + no_linkage_error (decl); + else + VEC_safe_push (tree, gc, no_linkage_decls, decl); } if (TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl) @@ -3956,7 +3952,6 @@ mark_used (tree decl) if (TREE_CODE (decl) == FUNCTION_DECL && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl) && DECL_DEFAULTED_FN (decl) - && !DECL_THUNK_P (decl) && ! DECL_INITIAL (decl)) { /* Synthesizing an implicitly defined member function will result in @@ -3973,8 +3968,8 @@ mark_used (tree decl) /* If this is a synthesized method we don't need to do the instantiation test below. */ } - else if ((DECL_NON_THUNK_FUNCTION_P (decl) || TREE_CODE (decl) == VAR_DECL) - && DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl) + else if ((TREE_CODE (decl) == FUNCTION_DECL || TREE_CODE (decl) == VAR_DECL) + && DECL_TEMPLATE_INFO (decl) && (!DECL_EXPLICIT_INSTANTIATION (decl) || always_instantiate_p (decl))) /* If this is a function or variable that is an instance of some