This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR48165
- From: Richard Guenther <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Thu, 17 Mar 2011 14:17:25 +0100 (CET)
- Subject: [PATCH] Fix PR48165
This fixes PR48165, we need to properly return sizetype quantities from
compute_object_offset.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk
and the branch.
Richard.
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.
Index: gcc/tree-object-size.c
===================================================================
*** gcc/tree-object-size.c (revision 171086)
--- gcc/tree-object-size.c (working copy)
*************** compute_object_offset (const_tree expr,
*** 143,149 ****
case MEM_REF:
gcc_assert (TREE_CODE (TREE_OPERAND (expr, 0)) == ADDR_EXPR);
! return TREE_OPERAND (expr, 1);
default:
return error_mark_node;
--- 143,149 ----
case MEM_REF:
gcc_assert (TREE_CODE (TREE_OPERAND (expr, 0)) == ADDR_EXPR);
! return double_int_to_tree (sizetype, mem_ref_offset (expr));
default:
return error_mark_node;
Index: gcc/testsuite/g++.dg/torture/pr48165.C
===================================================================
*** gcc/testsuite/g++.dg/torture/pr48165.C (revision 0)
--- gcc/testsuite/g++.dg/torture/pr48165.C (revision 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);
+ }