On Wed, Jun 27, 2007 at 09:59:58PM +0900, Neil Booth wrote:
> Al Viro wrote:-
> 
> > If you want to test ICE recognition, right now only the following places
> > are checking for it:
> >     * bitfield width
> >     * __attribute__((aligned(<number>)))
> >     * __attribute__((address_space(<number>)))
> >     * [<index>] in designators within initializer list
> >     * [<index> ... <index>] - ditto, gccism
> > 
> > That's it.  We can use it elsewhere too, but that's a separate bunch of
> > patches (trivial to do now).
> 
> Bah.  You don't escape that easily :)
> 
> extern int a;
> struct b { unsigned int b1:(1,2); };

Son of a...  expand_comma() cannibalizes the node, should restore ->flags
to 0 (same as other similar suckers).

> struct c { unsigned int c1: 1 ? 2: a++; };

Ditto for expand_conditional, but there we should preserve the original
->flags instead - might be non-zero and we ought to do that after
expanding the taken branch...

From: Al Viro <[EMAIL PROTECTED]>
Date: Wed, 27 Jun 2007 09:10:54 -0400
Subject: [PATCH] fix the missed cannibalizing simplifications

Signed-off-by: Al Viro <[EMAIL PROTECTED]>
---
 expand.c |    9 +++++++--
 1 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/expand.c b/expand.c
index f945518..9a536d5 100644
--- a/expand.c
+++ b/expand.c
@@ -429,8 +429,10 @@ static int expand_comma(struct expression *expr)
 
        cost = expand_expression(expr->left);
        cost += expand_expression(expr->right);
-       if (expr->left->type == EXPR_VALUE || expr->left->type == EXPR_FVALUE)
+       if (expr->left->type == EXPR_VALUE || expr->left->type == EXPR_FVALUE) {
                *expr = *expr->right;
+               expr->flags = 0;
+       }
        return cost;
 }
 
@@ -488,12 +490,15 @@ static int expand_conditional(struct expression *expr)
 
        cond_cost = expand_expression(cond);
        if (cond->type == EXPR_VALUE) {
+               unsigned flags = expr->flags;
                if (!cond->value)
                        true = false;
                if (!true)
                        true = cond;
+               cost = expand_expression(*true);
                *expr = *true;
-               return expand_expression(expr);
+               expr->flags = flags;
+               return cost;
        }
 
        cost = expand_expression(true);
-- 
1.5.0-rc2.GIT

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to