re PR lto/65475 (ICE in odr_vtable_hasher::equal (Segmentation fault))

PR ipa/65475
	* ipa-devirt.c (add_type_duplicate): Prevail polymorphic type over
	non-polymorphic
	* g++.dg/lto/pr65475_0.C: New testcase.
	* g++.dg/lto/pr65475_1.C: New testcase.

From-SVN: r221542
This commit is contained in:
Jan Hubicka 2015-03-20 19:19:18 +01:00 committed by Jan Hubicka
parent 05f23918fa
commit 730c436a33
4 changed files with 58 additions and 5 deletions

View File

@ -1412,9 +1412,18 @@ add_type_duplicate (odr_type val, tree type)
if (!val->types_set)
val->types_set = new hash_set<tree>;
/* Chose polymorphic type as leader (this happens only in case of ODR
violations. */
if ((TREE_CODE (type) == RECORD_TYPE && TYPE_BINFO (type)
&& polymorphic_type_binfo_p (TYPE_BINFO (type)))
&& (TREE_CODE (val->type) != RECORD_TYPE || !TYPE_BINFO (val->type)
|| !polymorphic_type_binfo_p (TYPE_BINFO (val->type))))
{
prevail = true;
build_bases = true;
}
/* Always prefer complete type to be the leader. */
if (!COMPLETE_TYPE_P (val->type) && COMPLETE_TYPE_P (type))
else if (!COMPLETE_TYPE_P (val->type) && COMPLETE_TYPE_P (type))
{
prevail = true;
build_bases = TYPE_BINFO (type);
@ -1563,7 +1572,8 @@ add_type_duplicate (odr_type val, tree type)
Be sure this does not happen. */
gcc_assert (TYPE_BINFO (type2)
|| !polymorphic_type_binfo_p (TYPE_BINFO (type1))
|| build_bases);
|| build_bases
|| val->odr_violated);
break;
}
/* One base is polymorphic and the other not.
@ -1865,9 +1875,9 @@ dump_odr_type (FILE *f, odr_type t, int indent=0)
fprintf (f, "%s\n", t->all_derivations_known ? " (derivations known)":"");
if (TYPE_NAME (t->type))
{
fprintf (f, "%*s defined at: %s:%i\n", indent * 2, "",
/*fprintf (f, "%*s defined at: %s:%i\n", indent * 2, "",
DECL_SOURCE_FILE (TYPE_NAME (t->type)),
DECL_SOURCE_LINE (TYPE_NAME (t->type)));
DECL_SOURCE_LINE (TYPE_NAME (t->type)));*/
if (DECL_ASSEMBLER_NAME_SET_P (TYPE_NAME (t->type)))
fprintf (f, "%*s mangled name: %s\n", indent * 2, "",
IDENTIFIER_POINTER

View File

@ -1,3 +1,9 @@
2015-03-20 Jan Hubicka <hubicka@ucw.cz>
PR ipa/65475
* g++.dg/lto/pr65475_0.C: New testcase.
* g++.dg/lto/pr65475_1.C: New testcase.
2015-03-20 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/64366

View File

@ -0,0 +1,10 @@
/* { dg-lto-do link } */
/* { dg-options "-O2 -Wno-odr" } */
/* { dg-extra-ld-options { -O2 -Wno-odr -r -nostdlib } } */
namespace std {
class ios_base {
struct A {};
class __attribute((__abi_tag__("cxx11"))) failure : A {};
} a;
}

View File

@ -0,0 +1,27 @@
namespace std {
template <typename, typename = int> class Trans_NS___cxx11_basic_ostringstream;
class ios_base {
class __attribute((__abi_tag__("cxx11"))) failure {
virtual char m_fn2();
};
};
class B : virtual ios_base {};
template <typename, typename> class Trans_NS___cxx11_basic_ostringstream : B {
public:
void m_fn1();
};
}
class A {
public:
A(int) {
std::Trans_NS___cxx11_basic_ostringstream<wchar_t> a;
a.m_fn1();
}
};
int b;
void fn1() { (A(b)); }
int
main()
{
}