[PATCH] Fix PR48165

Richard Guenther rguenther@suse.de
Thu Mar 17 13:17:00 GMT 2011


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



More information about the Gcc-patches mailing list