Re: [PATCH 16/16] fix handling of integer constant expressions
From: Al Viro
Date: Wed Jun 27 2007 - 09:18:35 EST
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 <viro@xxxxxxxxxxxxxxxxxx>
Date: Wed, 27 Jun 2007 09:10:54 -0400
Subject: [PATCH] fix the missed cannibalizing simplifications
Signed-off-by: Al Viro <viro@xxxxxxxxxxxxxxxxxx>
---
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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/