re PR lto/55525 (ICE: tree check: expected array_type, have pointer_type in array_ref...
authorRichard Biener <rguenther@suse.de>
Wed, 5 Dec 2012 08:47:40 +0000 (08:47 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 5 Dec 2012 08:47:40 +0000 (08:47 +0000)
2012-12-05  Richard Biener  <rguenther@suse.de>

PR lto/55525
* gimple-streamer-in.c (input_gimple_stmt): Fixup ARRAY_REFs as well.

* gcc.dg/lto/pr55525_0.c: New testcase.
* gcc.dg/lto/pr55525_1.c: Likewise.

From-SVN: r194183

gcc/ChangeLog
gcc/gimple-streamer-in.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/lto/pr55525_0.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/lto/pr55525_1.c [new file with mode: 0644]

index b9a1b088573bb6a4ea47ae5105c8847c4f3ceb52..8a8bb9e3a32b777e51be5baf70f42e8c17d83dca 100644 (file)
@@ -1,3 +1,8 @@
+2012-12-05  Richard Biener  <rguenther@suse.de>
+
+       PR lto/55525
+       * gimple-streamer-in.c (input_gimple_stmt): Fixup ARRAY_REFs as well.
+
 2012-12-04  Ian Lance Taylor  <iant@google.com>
 
        * godump.c (find_dummy_types): Output a dummy type if we couldn't
index 6736defcec514005b406debb931b9a913956c50c..49c4fe47a1f265b2726f26d3bd9e52fc4998f3b9 100644 (file)
@@ -148,14 +148,14 @@ input_gimple_stmt (struct lto_input_block *ib, struct data_in *data_in,
          if (!op)
            continue;
 
-         /* Fixup FIELD_DECLs in COMPONENT_REFs, they are not handled
-            by decl merging.  */
          if (TREE_CODE (op) == ADDR_EXPR)
            op = TREE_OPERAND (op, 0);
          while (handled_component_p (op))
            {
              if (TREE_CODE (op) == COMPONENT_REF)
                {
+                 /* Fixup FIELD_DECLs in COMPONENT_REFs, they are not handled
+                    by decl merging.  */
                  tree field, type, tem;
                  tree closest_match = NULL_TREE;
                  field = TREE_OPERAND (op, 1);
@@ -215,6 +215,18 @@ input_gimple_stmt (struct lto_input_block *ib, struct data_in *data_in,
                  else
                    TREE_OPERAND (op, 1) = tem;
                }
+             else if ((TREE_CODE (op) == ARRAY_REF
+                       || TREE_CODE (op) == ARRAY_RANGE_REF)
+                      && (TREE_CODE (TREE_TYPE (TREE_OPERAND (op, 0)))
+                          != ARRAY_TYPE))
+               {
+                 /* And ARRAY_REFs to objects that had mismatched types
+                    during symbol merging to avoid ICEs.  */
+                 TREE_OPERAND (op, 0)
+                   = build1 (VIEW_CONVERT_EXPR,
+                             build_array_type (TREE_TYPE (op), NULL_TREE),
+                             TREE_OPERAND (op, 0));
+               }
 
              op = TREE_OPERAND (op, 0);
            }
index 80a1af4cda76786741f9ddd6756729d209a1e163..ba114ee2b3744140bf9677d25d2b08f7bbd7d1fe 100644 (file)
@@ -1,3 +1,9 @@
+2012-12-05  Richard Biener  <rguenther@suse.de>
+
+       PR lto/55525
+       * gcc.dg/lto/pr55525_0.c: New testcase.
+       * gcc.dg/lto/pr55525_1.c: Likewise.
+
 2012-12-04  Tobias Burnus  <burnus@net-b.de>
 
        * gfortran.dg/quad_3.f90: Really fix an if condition.
diff --git a/gcc/testsuite/gcc.dg/lto/pr55525_0.c b/gcc/testsuite/gcc.dg/lto/pr55525_0.c
new file mode 100644 (file)
index 0000000..7f06918
--- /dev/null
@@ -0,0 +1,8 @@
+/* { dg-lto-do link } */
+/* { dg-lto-options { { -flto -w } } } */
+
+char s[8];
+int main(void)
+{
+  return strcmp(&s[1], "foo");
+}
diff --git a/gcc/testsuite/gcc.dg/lto/pr55525_1.c b/gcc/testsuite/gcc.dg/lto/pr55525_1.c
new file mode 100644 (file)
index 0000000..3c33817
--- /dev/null
@@ -0,0 +1 @@
+char *s = (char *) 0;