From: jason Date: Wed, 15 Apr 2015 21:17:21 +0000 (+0000) Subject: * decl.c (grokmethod): Only set DECL_COMDAT if TREE_PUBLIC is set. X-Git-Tag: upstream/6.1~7943 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8b2942f7c961ee83bb0ff605129165ecdf6ac8f6;p=platform%2Fupstream%2Flinaro-gcc.git * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@222134 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 519fc81..b18c2fb 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2015-04-15 Jason Merrill + * 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. 2015-04-15 Jason Merrill diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index c8323b0..0538570 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -14422,7 +14422,8 @@ grokmethod (cp_decl_specifier_seq *declspecs, check_template_shadow (fndecl); - DECL_COMDAT (fndecl) = 1; + if (TREE_PUBLIC (fndecl)) + DECL_COMDAT (fndecl) = 1; DECL_DECLARED_INLINE_P (fndecl) = 1; DECL_NO_INLINE_WARNING_P (fndecl) = 1; diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 5a58d33..b2251d8 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -1861,15 +1861,19 @@ maybe_make_one_only (tree decl) bool 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 before the function is processed, so we cannot simply check DECL_COMDAT. */ if (DECL_COMDAT (decl) - || (((TREE_CODE (decl) == FUNCTION_DECL - && DECL_DECLARED_INLINE_P (decl)) - || (DECL_LANG_SPECIFIC (decl) - && DECL_TEMPLATE_INSTANTIATION (decl))) - && TREE_PUBLIC (decl))) + || (TREE_CODE (decl) == FUNCTION_DECL + && DECL_DECLARED_INLINE_P (decl)) + || (DECL_LANG_SPECIFIC (decl) + && DECL_TEMPLATE_INSTANTIATION (decl))) return true; else if (DECL_FUNCTION_SCOPE_P (decl)) /* A local static in an inline effectively has vague linkage. */ diff --git a/gcc/cp/method.c b/gcc/cp/method.c index 33e2f3c..81f50e6 100644 --- a/gcc/cp/method.c +++ b/gcc/cp/method.c @@ -1925,8 +1925,9 @@ implicitly_declare_fn (special_function_kind kind, tree type, DECL_EXTERNAL (fn) = true; DECL_NOT_REALLY_EXTERN (fn) = 1; DECL_DECLARED_INLINE_P (fn) = 1; - DECL_COMDAT (fn) = 1; 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); gcc_assert (!TREE_USED (fn));