diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9bb7e2f607e..d3dfb305aa6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-03-25 Martin Jambor + + PR ipa/60600 + * ipa-cp.c (ipa_get_indirect_edge_target_1): Redirect type + inconsistent devirtualizations to __builtin_unreachable. + 2014-03-25 Marek Polacek PR c/35449 diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index b71048acc71..74042adb5a1 100644 --- a/gcc/ipa-cp.c +++ b/gcc/ipa-cp.c @@ -1639,11 +1639,18 @@ ipa_get_indirect_edge_target_1 (struct cgraph_edge *ie, return NULL_TREE; target = gimple_get_virt_method_for_binfo (token, binfo); } -#ifdef ENABLE_CHECKING - if (target) - gcc_assert (possible_polymorphic_call_target_p - (ie, cgraph_get_node (target))); -#endif + + if (target && !possible_polymorphic_call_target_p (ie, + cgraph_get_node (target))) + { + if (dump_file) + fprintf (dump_file, + "Type inconsident devirtualization: %s/%i->%s\n", + ie->caller->name (), ie->caller->order, + IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (target))); + target = builtin_decl_implicit (BUILT_IN_UNREACHABLE); + cgraph_get_create_node (target); + } return target; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 55d746675f0..da8d6437047 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-03-25 Martin Jambor + + PR ipa/60600 + * g++.dg/ipa/pr60600.C: New test. + 2014-03-25 John David Anglin PR testsuite/58013 diff --git a/gcc/testsuite/g++.dg/ipa/pr60600.C b/gcc/testsuite/g++.dg/ipa/pr60600.C new file mode 100644 index 00000000000..00c368e6329 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr60600.C @@ -0,0 +1,34 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -fdump-ipa-cp" } */ + +struct data { + data(int); +}; + +struct top { + virtual int topf(); +}; + +struct intermediate: top { + int topf() /* override */ { return 0; } +}; + +struct child1: top { + void childf() + { + data d(topf()); + } +}; + +struct child2: intermediate {}; + +void test(top& t) +{ + child1& c = static_cast(t); + c.childf(); + child2 d; + test(d); +} + +/* { dg-final { scan-ipa-dump "Type inconsident devirtualization" "cp" } } */ +/* { dg-final { cleanup-ipa-dump "cp" } } */