re PR c++/87229 (ICE: tree code 'call_expr' is not supported in LTO streams)
authorRichard Biener <rguenther@suse.de>
Mon, 19 Nov 2018 11:36:51 +0000 (11:36 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 19 Nov 2018 11:36:51 +0000 (11:36 +0000)
2018-11-19  Richard Biener  <rguenther@suse.de>

PR lto/87229
* tree.c (free_lang_data_in_one_sizepos): Free non-gimple-val
sizepos values.

* g++.dg/lto/pr87229_0.C: New testcase.

From-SVN: r266271

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lto/pr87229_0.C [new file with mode: 0644]
gcc/tree.c

index 98038718e7d31d18789bac5830538983692ddbd0..9cd89fb941be5a0f38fcf73cabbbf7381c8fa9bd 100644 (file)
@@ -1,3 +1,9 @@
+2018-11-19  Richard Biener  <rguenther@suse.de>
+
+       PR lto/87229
+       * tree.c (free_lang_data_in_one_sizepos): Free non-gimple-val
+       sizepos values.
+
 2018-11-19  Eric Botcazou  <ebotcazou@adacore.com>
 
        * compare-elim.c (struct comparison): Add not_in_a field.
index 3fff2c85e7b0ae029909e376bb182e3cba515725..5fce6a848182dfe50d21c1b52e8a049ecf9a9b85 100644 (file)
@@ -1,3 +1,8 @@
+2018-11-19  Richard Biener  <rguenther@suse.de>
+
+       PR lto/87229
+       * g++.dg/lto/pr87229_0.C: New testcase.
+
 2018-11-19  Martin Liska  <mliska@suse.cz>
 
        * g++.dg/gcov/pr84548.C: Remove remove-gcda.
diff --git a/gcc/testsuite/g++.dg/lto/pr87229_0.C b/gcc/testsuite/g++.dg/lto/pr87229_0.C
new file mode 100644 (file)
index 0000000..1c20e80
--- /dev/null
@@ -0,0 +1,7 @@
+// { dg-lto-do assemble }
+
+struct Main { Main(char* x); };
+
+Main::Main(char* x) {
+    char cfg[__builtin_strlen(x)];
+}
index be89897d43a9bb0080a84aa59dad7bd57e5b97c8..48de9cf350f0455a3251a94d541ba19d09326a98 100644 (file)
@@ -5254,6 +5254,13 @@ free_lang_data_in_one_sizepos (tree *expr_p)
   tree expr = *expr_p;
   if (CONTAINS_PLACEHOLDER_P (expr))
     *expr_p = build0 (PLACEHOLDER_EXPR, TREE_TYPE (expr));
+  /* ???  We have to reset all non-GIMPLE sizepos because those eventually
+     refer to trees we cannot stream.  See for example PR87229 which
+     shows an example with non-gimplified abstract origins in C++.
+     Note this should only happen for abstract copies so setting sizes
+     to NULL is OK (but we cannot easily assert this).  */
+  else if (expr && !is_gimple_val (expr))
+    *expr_p = NULL_TREE;
 }