re PR tree-optimization/48165 (gcc-4.6: internal compiler error: in build2_stat)
authorRichard Guenther <rguenther@suse.de>
Thu, 17 Mar 2011 13:19:01 +0000 (13:19 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 17 Mar 2011 13:19:01 +0000 (13:19 +0000)
2011-03-17  Richard Guenther  <rguenther@suse.de>

PR middle-end/48165
* tree-object-size.c (compute_object_offset): Properly return
the offset operand of MEM_REFs as sizetype.

* g++.dg/torture/pr48165.C: New testcase.

From-SVN: r171092

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr48165.C [new file with mode: 0644]
gcc/tree-object-size.c

index fce8c0ab3876f6275c199ae4d8ad2b46e725b2cb..cfb20edbb1a1ec78d2b58d33c5ac65e83958bb5f 100644 (file)
@@ -1,3 +1,9 @@
+2011-03-17  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/48165
+       * tree-object-size.c (compute_object_offset): Properly return
+       the offset operand of MEM_REFs as sizetype.
+
 2011-03-17  Jakub Jelinek  <jakub@redhat.com>
 
        PR rtl-optimization/48141
index b76cd474955e4f676e9c4e9af13bf4b3eb66a00f..a7d874981d3ce293aa91b2381db6d61ffd376426 100644 (file)
@@ -1,3 +1,8 @@
+2011-03-17  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/48165
+       * g++.dg/torture/pr48165.C: New testcase.
+
 2011-03-17  Jakub Jelinek  <jakub@redhat.com>
 
        PR rtl-optimization/48141
diff --git a/gcc/testsuite/g++.dg/torture/pr48165.C b/gcc/testsuite/g++.dg/torture/pr48165.C
new file mode 100644 (file)
index 0000000..a42893f
--- /dev/null
@@ -0,0 +1,38 @@
+/* { dg-do compile } */
+
+typedef __SIZE_TYPE__ size_t;
+
+extern "C" {
+    extern __inline __attribute__ ((__always_inline__))
+    __attribute__ ((__gnu_inline__, __artificial__)) void *
+    memcpy (void *__restrict __dest, __const void *__restrict __src,
+           size_t __len) throw ()
+      {
+       return __builtin___memcpy_chk (__dest, __src, __len,
+                                      __builtin_object_size (__dest, 0));
+      }
+}
+
+typedef char TCODE[20];
+typedef TCODE TCODE_ARRAY[5];
+typedef struct PARAM
+{
+  TCODE_ARRAY tcode;
+} PARAM;
+
+static void foo (void* p)
+{
+  char buffer[4+sizeof(PARAM)];
+  PARAM *param = (PARAM *)(buffer + 4);
+  int i;
+
+  for (i=0; i < 5; i++)
+    {
+      memcpy( param->tcode[i], p, 20 );
+    }
+}
+
+void bar (void* p)
+{
+  foo (p);
+}
index 23abcfe12c1b6a109e586da574627ceb59cfd1c2..6a74d19edc0a5877c92c3a3159fc6eb7f8689009 100644 (file)
@@ -143,7 +143,7 @@ compute_object_offset (const_tree expr, const_tree var)
 
     case MEM_REF:
       gcc_assert (TREE_CODE (TREE_OPERAND (expr, 0)) == ADDR_EXPR);
-      return TREE_OPERAND (expr, 1);
+      return double_int_to_tree (sizetype, mem_ref_offset (expr));
 
     default:
       return error_mark_node;