Commit d9fbd03b by Jason Merrill Committed by Jason Merrill

* decl2.c (mark_used): Streamline logic.

From-SVN: r151062
parent 3146f36f
2009-08-21 Jason Merrill <jason@redhat.com> 2009-08-24 Jason Merrill <jason@redhat.com>
* decl2.c (mark_used): Streamline logic.
PR c++/41109 PR c++/41109
PR c++/41110 PR c++/41110
......
...@@ -3865,7 +3865,8 @@ mark_used (tree decl) ...@@ -3865,7 +3865,8 @@ mark_used (tree decl)
DECL_LANG_SPECIFIC set, and these are also the only decls that we DECL_LANG_SPECIFIC set, and these are also the only decls that we
might need special handling for. */ might need special handling for. */
if ((TREE_CODE (decl) != VAR_DECL && TREE_CODE (decl) != FUNCTION_DECL) 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; return;
/* We only want to do this processing once. We don't need to keep trying /* We only want to do this processing once. We don't need to keep trying
...@@ -3917,22 +3918,17 @@ mark_used (tree decl) ...@@ -3917,22 +3918,17 @@ mark_used (tree decl)
o the variable or function is not used (3.2 [basic.def.odr]) or is o the variable or function is not used (3.2 [basic.def.odr]) or is
defined in the same translation unit. */ defined in the same translation unit. */
if (TREE_PUBLIC (decl) if (TREE_PUBLIC (decl)
&& (TREE_CODE (decl) == FUNCTION_DECL && !DECL_EXTERN_C_P (decl)
|| TREE_CODE (decl) == VAR_DECL) && !DECL_ARTIFICIAL (decl)
&& DECL_LANG_SPECIFIC (decl)) && !decl_defined_p (decl)
{ && no_linkage_check (TREE_TYPE (decl), /*relaxed_p=*/false))
if (!DECL_EXTERN_C_P (decl) {
&& !DECL_ARTIFICIAL (decl) if (is_local_extern (decl))
&& !decl_defined_p (decl) /* There's no way to define a local extern, and adding it to
&& no_linkage_check (TREE_TYPE (decl), /*relaxed_p=*/false)) the vector interferes with GC, so give an error now. */
{ no_linkage_error (decl);
if (is_local_extern (decl)) else
/* There's no way to define a local extern, and adding it to VEC_safe_push (tree, gc, no_linkage_decls, decl);
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) if (TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl)
...@@ -3956,7 +3952,6 @@ mark_used (tree decl) ...@@ -3956,7 +3952,6 @@ mark_used (tree decl)
if (TREE_CODE (decl) == FUNCTION_DECL if (TREE_CODE (decl) == FUNCTION_DECL
&& DECL_NONSTATIC_MEMBER_FUNCTION_P (decl) && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl)
&& DECL_DEFAULTED_FN (decl) && DECL_DEFAULTED_FN (decl)
&& !DECL_THUNK_P (decl)
&& ! DECL_INITIAL (decl)) && ! DECL_INITIAL (decl))
{ {
/* Synthesizing an implicitly defined member function will result in /* Synthesizing an implicitly defined member function will result in
...@@ -3973,8 +3968,8 @@ mark_used (tree decl) ...@@ -3973,8 +3968,8 @@ mark_used (tree decl)
/* If this is a synthesized method we don't need to /* If this is a synthesized method we don't need to
do the instantiation test below. */ do the instantiation test below. */
} }
else if ((DECL_NON_THUNK_FUNCTION_P (decl) || TREE_CODE (decl) == VAR_DECL) else if ((TREE_CODE (decl) == FUNCTION_DECL || TREE_CODE (decl) == VAR_DECL)
&& DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl) && DECL_TEMPLATE_INFO (decl)
&& (!DECL_EXPLICIT_INSTANTIATION (decl) && (!DECL_EXPLICIT_INSTANTIATION (decl)
|| always_instantiate_p (decl))) || always_instantiate_p (decl)))
/* If this is a function or variable that is an instance of some /* If this is a function or variable that is an instance of some
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment