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 <rguent...@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); + }