decl.c (grokmethod): Only set DECL_COMDAT if TREE_PUBLIC is set.
* decl.c (grokmethod): Only set DECL_COMDAT if TREE_PUBLIC is set. * method.c (implicitly_declare_fn): Likewise. * decl2.c (vague_linkage_p): Check TREE_PUBLIC first. From-SVN: r222134
This commit is contained in:
parent
bf5730d773
commit
efb5e8170a
|
@ -1,5 +1,9 @@
|
||||||
2015-04-15 Jason Merrill <jason@redhat.com>
|
2015-04-15 Jason Merrill <jason@redhat.com>
|
||||||
|
|
||||||
|
* decl.c (grokmethod): Only set DECL_COMDAT if TREE_PUBLIC is set.
|
||||||
|
* method.c (implicitly_declare_fn): Likewise.
|
||||||
|
* decl2.c (vague_linkage_p): Check TREE_PUBLIC first.
|
||||||
|
|
||||||
* decl2.c (determine_visibility): Use get_template_info.
|
* decl2.c (determine_visibility): Use get_template_info.
|
||||||
|
|
||||||
2015-04-15 Jason Merrill <jason@redhat.com>
|
2015-04-15 Jason Merrill <jason@redhat.com>
|
||||||
|
|
|
@ -14422,7 +14422,8 @@ grokmethod (cp_decl_specifier_seq *declspecs,
|
||||||
|
|
||||||
check_template_shadow (fndecl);
|
check_template_shadow (fndecl);
|
||||||
|
|
||||||
DECL_COMDAT (fndecl) = 1;
|
if (TREE_PUBLIC (fndecl))
|
||||||
|
DECL_COMDAT (fndecl) = 1;
|
||||||
DECL_DECLARED_INLINE_P (fndecl) = 1;
|
DECL_DECLARED_INLINE_P (fndecl) = 1;
|
||||||
DECL_NO_INLINE_WARNING_P (fndecl) = 1;
|
DECL_NO_INLINE_WARNING_P (fndecl) = 1;
|
||||||
|
|
||||||
|
|
|
@ -1861,15 +1861,19 @@ maybe_make_one_only (tree decl)
|
||||||
bool
|
bool
|
||||||
vague_linkage_p (tree decl)
|
vague_linkage_p (tree decl)
|
||||||
{
|
{
|
||||||
|
if (!TREE_PUBLIC (decl))
|
||||||
|
{
|
||||||
|
gcc_checking_assert (!DECL_COMDAT (decl));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
/* Unfortunately, import_export_decl has not always been called
|
/* Unfortunately, import_export_decl has not always been called
|
||||||
before the function is processed, so we cannot simply check
|
before the function is processed, so we cannot simply check
|
||||||
DECL_COMDAT. */
|
DECL_COMDAT. */
|
||||||
if (DECL_COMDAT (decl)
|
if (DECL_COMDAT (decl)
|
||||||
|| (((TREE_CODE (decl) == FUNCTION_DECL
|
|| (TREE_CODE (decl) == FUNCTION_DECL
|
||||||
&& DECL_DECLARED_INLINE_P (decl))
|
&& DECL_DECLARED_INLINE_P (decl))
|
||||||
|| (DECL_LANG_SPECIFIC (decl)
|
|| (DECL_LANG_SPECIFIC (decl)
|
||||||
&& DECL_TEMPLATE_INSTANTIATION (decl)))
|
&& DECL_TEMPLATE_INSTANTIATION (decl)))
|
||||||
&& TREE_PUBLIC (decl)))
|
|
||||||
return true;
|
return true;
|
||||||
else if (DECL_FUNCTION_SCOPE_P (decl))
|
else if (DECL_FUNCTION_SCOPE_P (decl))
|
||||||
/* A local static in an inline effectively has vague linkage. */
|
/* A local static in an inline effectively has vague linkage. */
|
||||||
|
|
|
@ -1925,8 +1925,9 @@ implicitly_declare_fn (special_function_kind kind, tree type,
|
||||||
DECL_EXTERNAL (fn) = true;
|
DECL_EXTERNAL (fn) = true;
|
||||||
DECL_NOT_REALLY_EXTERN (fn) = 1;
|
DECL_NOT_REALLY_EXTERN (fn) = 1;
|
||||||
DECL_DECLARED_INLINE_P (fn) = 1;
|
DECL_DECLARED_INLINE_P (fn) = 1;
|
||||||
DECL_COMDAT (fn) = 1;
|
|
||||||
set_linkage_according_to_type (type, fn);
|
set_linkage_according_to_type (type, fn);
|
||||||
|
if (TREE_PUBLIC (fn))
|
||||||
|
DECL_COMDAT (fn) = 1;
|
||||||
rest_of_decl_compilation (fn, toplevel_bindings_p (), at_eof);
|
rest_of_decl_compilation (fn, toplevel_bindings_p (), at_eof);
|
||||||
gcc_assert (!TREE_USED (fn));
|
gcc_assert (!TREE_USED (fn));
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue