re PR ipa/59947 (Segmentation fault with #pragma GCC optimize ("O2"), ICE in get_odr_...
authorJakub Jelinek <jakub@redhat.com>
Wed, 5 Feb 2014 15:34:25 +0000 (16:34 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 5 Feb 2014 15:34:25 +0000 (16:34 +0100)
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

gcc/ChangeLog
gcc/ipa-devirt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/pr59947.C [new file with mode: 0644]

index 9d26481..32a6a3e 100644 (file)
@@ -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.
index f137874..c110a98 100644 (file)
@@ -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.  */
index 00aca0a..4ea7056 100644 (file)
@@ -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 (file)
index 0000000..b9a9698
--- /dev/null
@@ -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>;