diff options
author | Jakub Jelinek <jakub@redhat.com> | 2019-05-03 09:32:06 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2019-05-03 09:32:06 +0200 |
commit | d1700aa1407c188165eb8e06f40bf059a9b81b16 (patch) | |
tree | 3f7581bb88b4a988b3141445a774c624632f5e4d | |
parent | 061a799b8e9b66c59dd55bb11c1b132ea74ebb43 (diff) | |
download | gcc-d1700aa1407c188165eb8e06f40bf059a9b81b16.zip gcc-d1700aa1407c188165eb8e06f40bf059a9b81b16.tar.gz gcc-d1700aa1407c188165eb8e06f40bf059a9b81b16.tar.bz2 |
re PR tree-optimization/90303 (ICE in hash_odr_name with fastcall attribute starting with r267359)
PR tree-optimization/90303
* ipa-devirt.c (obj_type_ref_class, get_odr_type): Don't use
TYPE_CANONICAL for TYPE_STRUCTURAL_EQUALITY_P types in !in_lto_p mode.
* g++.target/i386/pr90303.C: New test.
From-SVN: r270835
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ipa-devirt.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.target/i386/pr90303.C | 8 |
4 files changed, 21 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5973192..2c4150d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-05-03 Jakub Jelinek <jakub@redhat.com> + + PR tree-optimization/90303 + * ipa-devirt.c (obj_type_ref_class, get_odr_type): Don't use + TYPE_CANONICAL for TYPE_STRUCTURAL_EQUALITY_P types in !in_lto_p mode. + 2019-05-03 Richard Biener <rguenther@suse.de> PR tree-optimization/89698 diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c index defa2ed..3e040e2 100644 --- a/gcc/ipa-devirt.c +++ b/gcc/ipa-devirt.c @@ -2020,7 +2020,7 @@ obj_type_ref_class (const_tree ref) ref = TREE_VALUE (TYPE_ARG_TYPES (ref)); gcc_checking_assert (TREE_CODE (ref) == POINTER_TYPE); tree ret = TREE_TYPE (ref); - if (!in_lto_p) + if (!in_lto_p && !TYPE_STRUCTURAL_EQUALITY_P (ret)) ret = TYPE_CANONICAL (ret); else ret = get_odr_type (ret)->type; @@ -2042,7 +2042,7 @@ get_odr_type (tree type, bool insert) int base_id = -1; type = TYPE_MAIN_VARIANT (type); - if (!in_lto_p) + if (!in_lto_p && !TYPE_STRUCTURAL_EQUALITY_P (type)) type = TYPE_CANONICAL (type); gcc_checking_assert (can_be_name_hashed_p (type) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 660110d..509eb17 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-05-03 Jakub Jelinek <jakub@redhat.com> + + PR tree-optimization/90303 + * g++.target/i386/pr90303.C: New test. + 2019-05-03 Richard Biener <rguenther@suse.de> PR tree-optimization/89698 diff --git a/gcc/testsuite/g++.target/i386/pr90303.C b/gcc/testsuite/g++.target/i386/pr90303.C new file mode 100644 index 0000000..2a2dd06 --- /dev/null +++ b/gcc/testsuite/g++.target/i386/pr90303.C @@ -0,0 +1,8 @@ +// PR tree-optimization/90303 +// { dg-do compile { target ia32 } } +// { dg-additional-options "-O2" } + +struct A { virtual void foo (); }; +template <class> class B : A {}; +typedef void (__attribute__((fastcall)) F) (); +B<F> e; |