From: Martin Jambor Date: Thu, 12 Sep 2013 15:20:05 +0000 (+0200) Subject: re PR ipa/58389 (g++ ICE in ipa_find_reference) X-Git-Tag: releases/gcc-4.9.0~4107 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a854f8566acaabcc7f1c5c6aa69c9c29b11c67ce;p=thirdparty%2Fgcc.git re PR ipa/58389 (g++ ICE in ipa_find_reference) 2013-09-12 Martin Jambor 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 82c4c08ee38a..0acde629bd2d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2013-09-12 Martin Jambor + + 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 * tree-flow.h (FREE_SSANAMES): Move to tree-ssanames.c diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c index a0eea86fc0a5..9054d9065824 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 579c6b88515d..b818a986f8c5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-09-12 Martin Jambor + + PR ipa/58389 + * g++.dg/pr58389.C: New test. + 2013-09-12 Paolo Carlini * 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 000000000000..648c145459b1 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr58389.C @@ -0,0 +1,54 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +template +void __insertion_sort(_RandomAccessIterator, _Compare); +template +void __final_insertion_sort(_RandomAccessIterator p1, _Compare p2) { + _RandomAccessIterator a; + if (p1 - a) + ; + else + std: + __insertion_sort(0, p2); +} +template +void __introsort_loop(_RandomAccessIterator, _Size, _Compare); +template +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(this)->d_ptr->m_fn1(); }