diff mbox

[C] Fix PR52549

Message ID Pine.LNX.4.64.1204121714420.23071@jbgna.fhfr.qr
State New
Headers show

Commit Message

Richard Biener April 12, 2012, 3:16 p.m. UTC
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.

Comments

Richard Biener April 13, 2012, 9:24 a.m. UTC | #1
On Thu, 12 Apr 2012, Richard Guenther wrote:

> 
> 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.

Done.

> Ok?

Actually I changed my mind and consider it obvious.

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;
> +}
>
diff mbox

Patch

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