diff options
author | Martin Liska <mliska@suse.cz> | 2019-11-29 10:03:25 +0100 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2019-11-29 09:03:25 +0000 |
commit | efeeda757691b13e716c6681e7f6af5f85927e92 (patch) | |
tree | 3bfd1d32ae0f121f4e250b339637500eeb449da8 /gcc | |
parent | d5e82c9f686f6c8e2feabfe753258f9fc13d980f (diff) | |
download | gcc-efeeda757691b13e716c6681e7f6af5f85927e92.zip gcc-efeeda757691b13e716c6681e7f6af5f85927e92.tar.gz gcc-efeeda757691b13e716c6681e7f6af5f85927e92.tar.bz2 |
Check for TYPE_NAME in type_with_linkage_p.
2019-11-29 Martin Liska <mliska@suse.cz>
PR lto/91574
* ipa-devirt.c (types_same_for_odr): Check for existence
of TYPE_NAMEs first.
2019-11-29 Martin Liska <mliska@suse.cz>
PR lto/91574
* g++.dg/lto/pr91574_0.C: New test.
From-SVN: r278829
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ipa-devirt.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lto/pr91574_0.C | 23 |
4 files changed, 41 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1ef3bc2..229e2b6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-11-29 Martin Liska <mliska@suse.cz> + + PR lto/91574 + * ipa-devirt.c (types_same_for_odr): Check for existence + of TYPE_NAMEs first. + 2019-11-29 Richard Biener <rguenther@suse.de> PR tree-optimization/92704 diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c index 0b2475c..a884a46 100644 --- a/gcc/ipa-devirt.c +++ b/gcc/ipa-devirt.c @@ -356,6 +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; + /* If both type has mangled defined check if they are same. + Watch for anonymous types which are all mangled as "<anon">. */ + if (!type_with_linkage_p (type1) || !type_with_linkage_p (type2)) + return false; + if (type_in_anonymous_namespace_p (type1) + || type_in_anonymous_namespace_p (type2)) + return false; return (DECL_ASSEMBLER_NAME (TYPE_NAME (type1)) == DECL_ASSEMBLER_NAME (TYPE_NAME (type2))); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b787896..e0c37dd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-11-29 Martin Liska <mliska@suse.cz> + + PR lto/91574 + * g++.dg/lto/pr91574_0.C: New test. + 2019-11-29 Richard Biener <rguenther@suse.de> PR tree-optimization/92704 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 0000000..346a801 --- /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}; +} |