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
This commit is contained in:
parent
54e19c00d9
commit
add5c7634e
@ -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.
|
||||
|
@ -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. */
|
||||
|
@ -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.
|
||||
|
||||
|
34
gcc/testsuite/g++.dg/opt/pr59947.C
Normal file
34
gcc/testsuite/g++.dg/opt/pr59947.C
Normal file
@ -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>;
|
Loading…
Reference in New Issue
Block a user