diff options
author | Jakub Jelinek <jakub@redhat.com> | 2014-02-05 16:34:25 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2014-02-05 16:34:25 +0100 |
commit | add5c7634eb4e3cc62110bcaaacc19b70d62a6f0 (patch) | |
tree | 5dc90fd212c99fdb514aebbb39ddb9a13526b358 /gcc | |
parent | 54e19c00d9a901e0c55f812c2f7f98392976f5b2 (diff) | |
download | gcc-add5c7634eb4e3cc62110bcaaacc19b70d62a6f0.zip gcc-add5c7634eb4e3cc62110bcaaacc19b70d62a6f0.tar.gz gcc-add5c7634eb4e3cc62110bcaaacc19b70d62a6f0.tar.bz2 |
re PR ipa/59947 (Segmentation fault with #pragma GCC optimize ("O2"), ICE in get_odr_type)
PR ipa/59947
* ipa-devirt.c (possible_polymorphic_call_targets): Fix
a comment typo and formatting issue. If odr_hash hasn't been
created, return vNULL and set *completep to false.
* g++.dg/opt/pr59947.C: New test.
From-SVN: r207512
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/ipa-devirt.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/pr59947.C | 34 |
4 files changed, 51 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9d26481..32a6a3e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2014-02-05 Jakub Jelinek <jakub@redhat.com> + PR ipa/59947 + * ipa-devirt.c (possible_polymorphic_call_targets): Fix + a comment typo and formatting issue. If odr_hash hasn't been + created, return vNULL and set *completep to false. + PR middle-end/57499 * tree-eh.c (cleanup_empty_eh): Bail out on totally empty bb with no successors. diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c index f137874..c110a98 100644 --- a/gcc/ipa-devirt.c +++ b/gcc/ipa-devirt.c @@ -1359,7 +1359,7 @@ devirt_variable_node_removal_hook (varpool_node *n, temporarily change to one of base types. INCLUDE_DERIVER_TYPES make us to walk the inheritance graph for all derivations. - If COMPLETEP is non-NULL, store true if the list is complette. + If COMPLETEP is non-NULL, store true if the list is complete. CACHE_TOKEN (if non-NULL) will get stored to an unique ID of entry in the target cache. If user needs to visit every target list just once, it can memoize them. @@ -1378,7 +1378,7 @@ possible_polymorphic_call_targets (tree otr_type, static struct cgraph_node_hook_list *node_removal_hook_holder; pointer_set_t *inserted; pointer_set_t *matched_vtables; - vec <cgraph_node *> nodes=vNULL; + vec <cgraph_node *> nodes = vNULL; odr_type type, outer_type; polymorphic_call_target_d key; polymorphic_call_target_d **slot; @@ -1386,6 +1386,13 @@ possible_polymorphic_call_targets (tree otr_type, tree binfo, target; bool final; + if (!odr_hash.is_created ()) + { + if (completep) + *completep = false; + return nodes; + } + type = get_odr_type (otr_type, true); /* Lookup the outer class type we want to walk. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 00aca0a..4ea7056 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2014-02-05 Jakub Jelinek <jakub@redhat.com> + PR ipa/59947 + * g++.dg/opt/pr59947.C: New test. + PR c++/58703 * c-c++-common/gomp/pr58703.c: New test. diff --git a/gcc/testsuite/g++.dg/opt/pr59947.C b/gcc/testsuite/g++.dg/opt/pr59947.C new file mode 100644 index 0000000..b9a9698 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr59947.C @@ -0,0 +1,34 @@ +// PR ipa/59947 +// { dg-do compile } +// { dg-options "-O0 -std=c++11" } + +#pragma GCC optimize ("O2") +template <typename T> +inline void +foo (T & a) noexcept { T tmp = static_cast <T &&> (a); }; +struct A +{ + A () noexcept : a (1), b (1) {} + virtual void c () noexcept = 0; + void d () noexcept { c (); } + int a; + int b; +}; +struct B +{ + ~B () noexcept { e->d (); } + A *e; +}; +template <typename T> +struct C +{ + B f; +}; +struct D {}; +template <typename T> +struct E +{ + void bar () { foo (g); } + C <D> g; +}; +template class E <char>; |