aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/torture/pr88130.C27
-rw-r--r--gcc/varpool.c10
4 files changed, 43 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f79bab5..708eb50 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 269d780..613f048 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..911cf6c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr88130.C
@@ -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 (...) {
+ }
+}
diff --git a/gcc/varpool.c b/gcc/varpool.c
index 2aa59f9..edffa55 100644
--- a/gcc/varpool.c
+++ b/gcc/varpool.c
@@ -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))