summaryrefslogtreecommitdiff
path: root/gcc/ipa-devirt.c
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2015-05-19 23:02:06 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2015-05-19 21:02:06 +0000
commit4d6eb35a6dbe6c9808779ca446667f8a8374a11b (patch)
tree931fdcb291847f90f2d4c69e3f993bf2c4cd3d2e /gcc/ipa-devirt.c
parent296a8c2f54dd8bf2f84c687db8329f179774220e (diff)
downloadgcc-4d6eb35a6dbe6c9808779ca446667f8a8374a11b.tar.gz
ipa-devirt.c (type_in_anonymous_namespace_p): Return true or implicit declarations.
* ipa-devirt.c (type_in_anonymous_namespace_p): Return true or implicit declarations. (odr_type_p): Check that TYPE_NAME is TYPE_DECL before looking into it. (get_odr_type): Check type has linkage before adding bases. (register_odr_type): Check that type has linkage before adding it. (type_known_to_have_no_deriavations_p): Rename to .. (type_known_to_have_no_derivations_p): This one. * ipa-utils.h (type_known_to_have_no_deriavations_p): Rename to .. (type_known_to_have_no_derivations_p): This one. * ipa-polymorphic-call.c (ipa_polymorphic_call_context::restrict_to_inner_type): Check that type has linkage. From-SVN: r223415
Diffstat (limited to 'gcc/ipa-devirt.c')
-rw-r--r--gcc/ipa-devirt.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c
index bf43859f47e..09c3b5b0455 100644
--- a/gcc/ipa-devirt.c
+++ b/gcc/ipa-devirt.c
@@ -269,6 +269,8 @@ type_in_anonymous_namespace_p (const_tree t)
if (TYPE_STUB_DECL (t) && !TREE_PUBLIC (TYPE_STUB_DECL (t)))
{
+ if (DECL_ARTIFICIAL (TYPE_NAME (t)))
+ return true;
tree ctx = DECL_CONTEXT (TYPE_NAME (t));
while (ctx)
{
@@ -296,7 +298,7 @@ odr_type_p (const_tree t)
to care, since it is used only for type merging. */
gcc_checking_assert (in_lto_p || flag_lto);
- return (TYPE_NAME (t)
+ return (TYPE_NAME (t) && TREE_CODE (TYPE_NAME (t)) == TYPE_DECL
&& (DECL_ASSEMBLER_NAME_SET_P (TYPE_NAME (t))));
}
@@ -2124,6 +2126,7 @@ get_odr_type (tree type, bool insert)
}
if (build_bases && TREE_CODE (type) == RECORD_TYPE && TYPE_BINFO (type)
+ && type_with_linkage_p (type)
&& type == TYPE_MAIN_VARIANT (type))
{
tree binfo = TYPE_BINFO (type);
@@ -2183,7 +2186,8 @@ register_odr_type (tree type)
makes it possible that non-ODR type is main_odr_variant of ODR type.
Things may get smoother if LTO FE set mangled name of those types same
way as C++ FE does. */
- if (odr_type_p (main_odr_variant (TYPE_MAIN_VARIANT (type))))
+ if (odr_type_p (main_odr_variant (TYPE_MAIN_VARIANT (type)))
+ && odr_type_p (TYPE_MAIN_VARIANT (type)))
get_odr_type (TYPE_MAIN_VARIANT (type), true);
if (TYPE_MAIN_VARIANT (type) != type && odr_type_p (main_odr_variant (type)))
get_odr_type (type, true);
@@ -2192,7 +2196,7 @@ register_odr_type (tree type)
/* Return true if type is known to have no derivations. */
bool
-type_known_to_have_no_deriavations_p (tree t)
+type_known_to_have_no_derivations_p (tree t)
{
return (type_all_derivations_known_p (t)
&& (TYPE_FINAL_P (t)