OSDN Git Service

2011-03-17 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 17 Mar 2011 13:19:01 +0000 (13:19 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 17 Mar 2011 13:19:01 +0000 (13:19 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@171092 138bc75d-0d04-0410-961f-82ee72b054a4

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

index fce8c0a..cfb20ed 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 b76cd47..a7d8749 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 23abcfe..6a74d19 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;