diff --git a/gcc9-pr90303.patch b/gcc9-pr90303.patch new file mode 100644 index 0000000..f67c9dd --- /dev/null +++ b/gcc9-pr90303.patch @@ -0,0 +1,39 @@ +2019-05-03 Jakub Jelinek + + 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. + +--- gcc/ipa-devirt.c (revision 270834) ++++ gcc/ipa-devirt.c (revision 270835) +@@ -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) +--- gcc/testsuite/g++.target/i386/pr90303.C (nonexistent) ++++ gcc/testsuite/g++.target/i386/pr90303.C (revision 270835) +@@ -0,0 +1,8 @@ ++// PR tree-optimization/90303 ++// { dg-do compile { target ia32 } } ++// { dg-additional-options "-O2" } ++ ++struct A { virtual void foo (); }; ++template class B : A {}; ++typedef void (__attribute__((fastcall)) F) (); ++B e;