re PR lto/88130 (ICE in copy_function_or_variable, at lto-streamer-out.c:2315 since...
authorJan Hubicka <hubicka@ucw.cz>
Wed, 2 Jan 2019 15:23:27 +0000 (16:23 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Wed, 2 Jan 2019 15:23:27 +0000 (15:23 +0000)
PR lto/88130
* varpool.c (varpool_node::ctor_useable_for_folding_p): Also return
false at WPA time when body was removed.
* g++.dg/torture/pr88130.C: New testcase.

From-SVN: r267515

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr88130.C [new file with mode: 0644]
gcc/varpool.c

index f79bab5..708eb50 100644 (file)
@@ -1,3 +1,9 @@
+2019-01-02  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR lto/88130
+       * varpool.c (varpool_node::ctor_useable_for_folding_p): Also return
+       false at WPA time when body was removed.
+
 2019-01-02  Martin Liska  <mliska@suse.cz>
 
        PR tree-optimization/88650
index 269d780..613f048 100644 (file)
@@ -1,3 +1,8 @@
+2019-01-02  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR lto/88130
+       * g++.dg/torture/pr88130.C: New testcase.
+
 2019-01-02  Martin Liska  <mliska@suse.cz>
 
        PR tree-optimization/88650
diff --git a/gcc/testsuite/g++.dg/torture/pr88130.C b/gcc/testsuite/g++.dg/torture/pr88130.C
new file mode 100644 (file)
index 0000000..911cf6c
--- /dev/null
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-flto" } */
+/* { dg-require-effective-target lto } */
+class a {
+public:
+  static const long b = 1;
+};
+struct c {
+  enum d { e };
+};
+class C;
+class f {
+public:
+  f(c::d);
+  template <typename g> C operator<=(g);
+};
+class C {
+public:
+  template <typename h> void operator!=(h &);
+};
+void i() {
+  f j(c::e);
+  try {
+    j <= 0 != a::b;
+  } catch (...) {
+  }
+}
index 2aa59f9..edffa55 100644 (file)
@@ -335,16 +335,16 @@ varpool_node::ctor_useable_for_folding_p (void)
   if (TREE_THIS_VOLATILE (decl))
     return false;
 
+  /* Avoid attempts to load constructors that was not streamed.  */
+  if (in_lto_p && DECL_INITIAL (real_node->decl) == error_mark_node
+      && real_node->body_removed)
+    return false;
+
   /* If we do not have a constructor, we can't use it.  */
   if (DECL_INITIAL (real_node->decl) == error_mark_node
       && !real_node->lto_file_data)
     return false;
 
-  /* Avoid attempts to load constructors that was not streamed.  */
-  if (flag_ltrans && DECL_INITIAL (real_node->decl) == error_mark_node
-      && real_node->body_removed)
-    return false;
-
   /* Vtables are defined by their types and must match no matter of interposition
      rules.  */
   if (DECL_VIRTUAL_P (decl))