aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2014-02-05 16:34:25 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2014-02-05 16:34:25 +0100
commitadd5c7634eb4e3cc62110bcaaacc19b70d62a6f0 (patch)
tree5dc90fd212c99fdb514aebbb39ddb9a13526b358 /gcc
parent54e19c00d9a901e0c55f812c2f7f98392976f5b2 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/ipa-devirt.c11
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/opt/pr59947.C34
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>;