diff options
author | Martin Jambor <mjambor@suse.cz> | 2014-03-25 19:22:41 +0100 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2014-03-25 19:22:41 +0100 |
commit | b5165eb022d3a0436e6ab3aa9fcfbabf30aebf7b (patch) | |
tree | a145c18206b495d88a65796a9838661c0082b789 /gcc | |
parent | 1cbba79d074af647f641e9b684b8bba242421241 (diff) | |
download | gcc-b5165eb022d3a0436e6ab3aa9fcfbabf30aebf7b.zip gcc-b5165eb022d3a0436e6ab3aa9fcfbabf30aebf7b.tar.gz gcc-b5165eb022d3a0436e6ab3aa9fcfbabf30aebf7b.tar.bz2 |
re PR ipa/60600 (ICE in ipa_get_indirect_edge_target_1)
2014-03-25 Martin Jambor <mjambor@suse.cz>
PR ipa/60600
* ipa-cp.c (ipa_get_indirect_edge_target_1): Redirect type
inconsistent devirtualizations to __builtin_unreachable.
testsuite/
* g++.dg/ipa/pr60600.C: New test.
From-SVN: r208818
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ipa-cp.c | 17 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ipa/pr60600.C | 34 |
4 files changed, 57 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9bb7e2f..d3dfb30 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-03-25 Martin Jambor <mjambor@suse.cz> + + PR ipa/60600 + * ipa-cp.c (ipa_get_indirect_edge_target_1): Redirect type + inconsistent devirtualizations to __builtin_unreachable. + 2014-03-25 Marek Polacek <polacek@redhat.com> PR c/35449 diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index b71048a..74042ad 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 55d7466..da8d643 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-03-25 Martin Jambor <mjambor@suse.cz> + + PR ipa/60600 + * g++.dg/ipa/pr60600.C: New test. + 2014-03-25 John David Anglin <danglin@gcc.gnu.org> 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 0000000..00c368e --- /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<child1&>(t); + c.childf(); + child2 d; + test(d); +} + +/* { dg-final { scan-ipa-dump "Type inconsident devirtualization" "cp" } } */ +/* { dg-final { cleanup-ipa-dump "cp" } } */ |