This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH][C] Fix PR52549
- From: Richard Guenther <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Cc: "Joseph S. Myers" <joseph at codesourcery dot com>
- Date: Thu, 12 Apr 2012 17:16:50 +0200 (CEST)
- Subject: [PATCH][C] Fix PR52549
This fixes PR52549 - we are running into an overzealous assert
that wants to make sure we don't have PLUS_EXPR on pointers.
But that code does not really check this and falls foul of
the conversion removal code right before it that transforms
(void *)(a + b) to a + b.
Fixed as follows.
Bootstrap and regtest pending on x86_64-unknown-linux-gnu.
Ok?
Thanks,
Richard.
2012-04-12 Richard Guenther <rguenther@suse.de>
PR c/52549
* c-typeck.c (pointer_diff): Remove bogus assert.
* gcc.dg/pr52549.c: New testcase.
Index: gcc/c-typeck.c
===================================================================
--- gcc/c-typeck.c (revision 186373)
+++ gcc/c-typeck.c (working copy)
@@ -3446,8 +3446,6 @@ pointer_diff (location_t loc, tree op0,
else
con1 = op1;
- gcc_assert (TREE_CODE (con0) != PLUS_EXPR
- && TREE_CODE (con1) != PLUS_EXPR);
if (TREE_CODE (con0) == POINTER_PLUS_EXPR)
{
lit0 = TREE_OPERAND (con0, 1);
Index: gcc/testsuite/gcc.dg/pr52549.c
===================================================================
--- gcc/testsuite/gcc.dg/pr52549.c (revision 0)
+++ gcc/testsuite/gcc.dg/pr52549.c (revision 0)
@@ -0,0 +1,6 @@
+/* { dg-do compile } */
+
+_mark (long obj, int i, char *a)
+{
+ (char *)&(((long *)(obj)) [i]) - a;
+}