From: Eric Botcazou Date: Fri, 29 Jun 2007 06:11:17 +0000 (+0000) Subject: c-common.c (pointer_int_sum): Do the negation in sizetype. X-Git-Tag: releases/gcc-4.3.0~4252 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=280f1ffa2782edfc55fa6e0f8c6071b85b94b7cf;p=thirdparty%2Fgcc.git c-common.c (pointer_int_sum): Do the negation in sizetype. * c-common.c (pointer_int_sum): Do the negation in sizetype. From-SVN: r126108 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 669640aae505..082b207bc0e7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2007-06-29 Eric Botcazou + + * c-common.c (pointer_int_sum): Do the negation in sizetype. + 2007-06-28 DJ Delorie * config/m32c/m32c.h (OVERRIDE_OPTIONS): Omit unneeded semicolon. diff --git a/gcc/c-common.c b/gcc/c-common.c index e1c387502040..5243dd749f9e 100644 --- a/gcc/c-common.c +++ b/gcc/c-common.c @@ -2627,7 +2627,6 @@ pointer_int_sum (enum tree_code resultcode, tree ptrop, tree intop) tree size_exp, ret; /* The result is a pointer of the same type that is being added. */ - tree result_type = TREE_TYPE (ptrop); if (TREE_CODE (TREE_TYPE (result_type)) == VOID_TYPE) @@ -2661,7 +2660,6 @@ pointer_int_sum (enum tree_code resultcode, tree ptrop, tree intop) contains a constant term, apply distributive law and multiply that constant term separately. This helps produce common subexpressions. */ - if ((TREE_CODE (intop) == PLUS_EXPR || TREE_CODE (intop) == MINUS_EXPR) && !TREE_CONSTANT (intop) && TREE_CONSTANT (TREE_OPERAND (intop, 1)) @@ -2690,7 +2688,6 @@ pointer_int_sum (enum tree_code resultcode, tree ptrop, tree intop) /* Convert the integer argument to a type the same size as sizetype so the multiply won't overflow spuriously. */ - if (TYPE_PRECISION (TREE_TYPE (intop)) != TYPE_PRECISION (sizetype) || TYPE_UNSIGNED (TREE_TYPE (intop)) != TYPE_UNSIGNED (sizetype)) intop = convert (c_common_type_for_size (TYPE_PRECISION (sizetype), @@ -2698,17 +2695,15 @@ pointer_int_sum (enum tree_code resultcode, tree ptrop, tree intop) /* Replace the integer argument with a suitable product by the object size. Do this multiplication as signed, then convert to the appropriate - pointer type (actually unsigned integral). */ - - intop = build_binary_op (MULT_EXPR, intop, - convert (TREE_TYPE (intop), size_exp), 1); + type for the pointer operation. */ + intop = convert (sizetype, + build_binary_op (MULT_EXPR, intop, + convert (TREE_TYPE (intop), size_exp), 1)); + /* Create the sum or difference. */ if (resultcode == MINUS_EXPR) - intop = fold_build1 (NEGATE_EXPR, TREE_TYPE (intop), intop); - - intop = convert (sizetype, intop); + intop = fold_build1 (NEGATE_EXPR, sizetype, intop); - /* Create the sum or difference. */ ret = fold_build2 (POINTER_PLUS_EXPR, result_type, ptrop, intop); fold_undefer_and_ignore_overflow_warnings (); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7552ef4304b2..d023d472c982 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2007-06-29 Eric Botcazou + + * gcc.dg/pointer-arith-9.c: New test. + 2007-06-29 Tobias Burnus PR fortran/32483 diff --git a/gcc/testsuite/gcc.dg/pointer-arith-9.c b/gcc/testsuite/gcc.dg/pointer-arith-9.c new file mode 100644 index 000000000000..2d2611272004 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pointer-arith-9.c @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +/* { dg-options "" } */ + +void *foo(void) +{ + return (void *)0 - 1; +}