Hi. This one another IPA devirt ICE fix where we can end up with a local array that has not TYPE_NAME.
Patch can bootstrap on x86_64-linux-gnu and survives regression tests. Ready to be installed? Thanks, Martin gcc/ChangeLog: 2019-11-27 Martin Liska <mli...@suse.cz> PR lto/91574 * ipa-devirt.c (types_same_for_odr): Check for existence of TYPE_NAMEs. gcc/testsuite/ChangeLog: 2019-11-27 Martin Liska <mli...@suse.cz> PR lto/91574 * g++.dg/lto/pr91574_0.C: New test. --- gcc/ipa-devirt.c | 9 +++++++-- gcc/testsuite/g++.dg/lto/pr91574_0.C | 23 +++++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/lto/pr91574_0.C
diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c index c158d3c968d..72b5ee422e1 100644 --- a/gcc/ipa-devirt.c +++ b/gcc/ipa-devirt.c @@ -356,8 +356,13 @@ types_same_for_odr (const_tree type1, const_tree type2) || (type_with_linkage_p (type2) && type_in_anonymous_namespace_p (type2))) return false; - return (DECL_ASSEMBLER_NAME (TYPE_NAME (type1)) - == DECL_ASSEMBLER_NAME (TYPE_NAME (type2))); + tree tn1 = TYPE_NAME (type1); + tree tn2 = TYPE_NAME (type2); + + /* We may meet a locally defined ARRAY_TYPE which + has not an assembler name. */ + return (tn1 != NULL_TREE && tn2 != NULL_TREE + && DECL_ASSEMBLER_NAME (tn1) == DECL_ASSEMBLER_NAME (tn2)); } /* Return true if we can decide on ODR equivalency. diff --git a/gcc/testsuite/g++.dg/lto/pr91574_0.C b/gcc/testsuite/g++.dg/lto/pr91574_0.C new file mode 100644 index 00000000000..346a8015c98 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr91574_0.C @@ -0,0 +1,23 @@ +// PR lto/91574 +// { dg-lto-do link } +// { dg-lto-options { { -fPIC -flto -O2 } } } +// { dg-require-effective-target shared } +// { dg-require-effective-target fpic } +// { dg-extra-ld-options "-shared" } + +class A +{ +public: + virtual ~A (); + A (A &); + virtual unsigned m_fn1 () const; +}; +class B : A +{ + unsigned m_fn1 () const; +}; +void +fn1 (B p1) +{ + B a[]{p1, p1}; +}