aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2007-06-29 06:11:17 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2007-06-29 06:11:17 +0000
commit280f1ffa2782edfc55fa6e0f8c6071b85b94b7cf (patch)
tree5976c29f228db9cd8c5b348833f6a8f115e967e0
parente444a887ab80c9232354b3070da96a139ea403c8 (diff)
downloadgcc-280f1ffa2782edfc55fa6e0f8c6071b85b94b7cf.zip
gcc-280f1ffa2782edfc55fa6e0f8c6071b85b94b7cf.tar.gz
gcc-280f1ffa2782edfc55fa6e0f8c6071b85b94b7cf.tar.bz2
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
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/c-common.c17
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/pointer-arith-9.c7
4 files changed, 21 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 669640a..082b207 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,7 @@
+2007-06-29 Eric Botcazou <ebotcazou@adacore.com>
+
+ * c-common.c (pointer_int_sum): Do the negation in sizetype.
+
2007-06-28 DJ Delorie <dj@redhat.com>
* config/m32c/m32c.h (OVERRIDE_OPTIONS): Omit unneeded semicolon.
diff --git a/gcc/c-common.c b/gcc/c-common.c
index e1c3875..5243dd7 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 7552ef4..d023d47 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2007-06-29 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gcc.dg/pointer-arith-9.c: New test.
+
2007-06-29 Tobias Burnus <burnus@net-b.de>
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 0000000..2d26112
--- /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;
+}