diff options
author | Martin Jambor <mjambor@suse.cz> | 2013-09-12 17:20:05 +0200 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2013-09-12 17:20:05 +0200 |
commit | a854f8566acaabcc7f1c5c6aa69c9c29b11c67ce (patch) | |
tree | f007460dfeaf58b393da5b3e56c4d0f470b53ff5 /gcc | |
parent | 274ddab613ae4f3427eaf02859e5bbcceabbaadf (diff) | |
download | gcc-a854f8566acaabcc7f1c5c6aa69c9c29b11c67ce.zip gcc-a854f8566acaabcc7f1c5c6aa69c9c29b11c67ce.tar.gz gcc-a854f8566acaabcc7f1c5c6aa69c9c29b11c67ce.tar.bz2 |
re PR ipa/58389 (g++ ICE in ipa_find_reference)
2013-09-12 Martin Jambor <mjambor@suse.cz>
PR ipa/58389
* ipa-prop.c (remove_described_reference): Give up if the edge in the
reference descriptor is NULL.
(ipa_edge_removal_hook): If owning a reference descriptor, set its
edge to NULL.
testsuite/
* g++.dg/pr58389.C: New test.
From-SVN: r202532
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/ipa-prop.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/pr58389.C | 54 |
4 files changed, 77 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 82c4c08..0acde62 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2013-09-12 Martin Jambor <mjambor@suse.cz> + + PR ipa/58389 + * ipa-prop.c (remove_described_reference): Give up if the edge in the + reference descriptor is NULL. + (ipa_edge_removal_hook): If owning a reference descriptor, set its + edge to NULL. + 2013-09-12 Andrew MacLeod <amacleod@redhat.com> * tree-flow.h (FREE_SSANAMES): Move to tree-ssanames.c diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c index a0eea86..9054d90 100644 --- a/gcc/ipa-prop.c +++ b/gcc/ipa-prop.c @@ -2506,6 +2506,8 @@ remove_described_reference (symtab_node symbol, struct ipa_cst_ref_desc *rdesc) struct cgraph_edge *origin; origin = rdesc->cs; + if (!origin) + return false; to_del = ipa_find_reference ((symtab_node) origin->caller, symbol, origin->call_stmt, origin->lto_stmt_uid); if (!to_del) @@ -3019,7 +3021,14 @@ ipa_edge_removal_hook (struct cgraph_edge *cs, void *data ATTRIBUTE_UNUSED) struct ipa_jump_func *jf; int i; FOR_EACH_VEC_ELT (*args->jump_functions, i, jf) - try_decrement_rdesc_refcount (jf); + { + struct ipa_cst_ref_desc *rdesc; + try_decrement_rdesc_refcount (jf); + if (jf->type == IPA_JF_CONST + && (rdesc = ipa_get_jf_constant_rdesc (jf)) + && rdesc->cs == cs) + rdesc->cs = NULL; + } } ipa_free_edge_args_substructures (IPA_EDGE_REF (cs)); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 579c6b8..b818a98 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-09-12 Martin Jambor <mjambor@suse.cz> + + PR ipa/58389 + * g++.dg/pr58389.C: New test. + 2013-09-12 Paolo Carlini <paolo.carlini@oracle.com> * g++.dg/template/pseudodtor2.C: Add column number to dg-error diff --git a/gcc/testsuite/g++.dg/pr58389.C b/gcc/testsuite/g++.dg/pr58389.C new file mode 100644 index 0000000..648c145 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr58389.C @@ -0,0 +1,54 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +template <typename _RandomAccessIterator, typename _Compare> +void __insertion_sort(_RandomAccessIterator, _Compare); +template <typename _RandomAccessIterator, typename _Compare> +void __final_insertion_sort(_RandomAccessIterator p1, _Compare p2) { + _RandomAccessIterator a; + if (p1 - a) + ; + else + std: + __insertion_sort(0, p2); +} +template <typename _RandomAccessIterator, typename _Size, typename _Compare> +void __introsort_loop(_RandomAccessIterator, _Size, _Compare); +template <typename _RandomAccessIterator, typename _Compare> +void sort(_RandomAccessIterator, _RandomAccessIterator p2, _Compare p3) { +std: + __introsort_loop(0, 0, p3); + __final_insertion_sort(p2, p3); +} +class A { +public: + int m_fn1(); + void __lg(); + class B { + public: + int i; + int operator-(B); + }; +}; +class C; +class D { +public: + C *operator->(); +}; +class F { + A m_fn1() const; + D d_ptr; +}; +class C { + friend F; + void m_fn1(); + A children; +}; +void qt_notclosestLeaf(); +inline void C::m_fn1() { + A::B b, c; + if (children.m_fn1()) { + sort(c, b, qt_notclosestLeaf); + } +} +A F::m_fn1() const { const_cast<F *>(this)->d_ptr->m_fn1(); } |