From: Richard Kenner Date: Wed, 9 Mar 1994 21:49:14 +0000 (-0500) Subject: (pointer_int_sum): Multiplication should be done signed. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6946afd3a556e0681ea8f381d2492c26b98a8a39;p=gcc.git (pointer_int_sum): Multiplication should be done signed. (pointer_diff): Likewise the division. From-SVN: r6733 --- diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index 9b56bf920d4..412f3c3de81 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -2520,10 +2520,13 @@ pointer_int_sum (resultcode, ptrop, intop) if (TYPE_PRECISION (TREE_TYPE (intop)) != POINTER_SIZE) intop = convert (type_for_size (POINTER_SIZE, 0), intop); - /* Replace the integer argument - with a suitable product by the object size. */ + /* 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, size_exp, 1); + intop = convert (result_type, + build_binary_op (MULT_EXPR, intop, + convert (TREE_TYPE (intop), size_exp), 1)); /* Create the sum or difference. */ @@ -2563,12 +2566,13 @@ pointer_diff (op0, op1) /* This generates an error if op1 is pointer to incomplete type. */ if (TYPE_SIZE (TREE_TYPE (TREE_TYPE (op1))) == 0) error ("arithmetic on pointer to an incomplete type"); + /* This generates an error if op0 is pointer to incomplete type. */ op1 = c_size_in_bytes (target_type); /* Divide by the size, in easiest possible way. */ - result = build (EXACT_DIV_EXPR, restype, op0, op1); + result = build (EXACT_DIV_EXPR, restype, op0, convert (restype, op1)); folded = fold (result); if (folded == result)