aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
authorLinus Torvalds <torvalds@ppc970.osdl.org>2004-09-23 15:49:26 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-07 21:03:19 -0700
commit0413d55a587760cb4054beefbeca31dd253ed08c (patch)
treedbc726cc2c627364bae4745298e1567bfc0b6f68
parent51d406d9b6be16bf4a456ab44d34984cbc80d1cc (diff)
downloadsparse-dev-0413d55a587760cb4054beefbeca31dd253ed08c.tar.gz
Simplify nested EXPR_POS expressions.
They happen with the new struct xxx x = { .a.b[10].c = val; } syntax.
-rw-r--r--expand.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/expand.c b/expand.c
index 8ef711de..76392696 100644
--- a/expand.c
+++ b/expand.c
@@ -704,6 +704,30 @@ static int expand_expression_list(struct expression_list *list)
return cost;
}
+/*
+ * We can simplify nested position expressions if
+ * this is a simple (single) positional expression.
+ */
+static int expand_pos_expression(struct expression *expr)
+{
+ struct expression *nested = expr->init_expr;
+ unsigned long offset = expr->init_offset;
+ int nr = expr->init_nr;
+ int cost;
+
+ cost = expand_expression(nested);
+ if (nr == 1) {
+ if (nested->type == EXPR_POS) {
+ if (nested->init_nr == 1) {
+ offset += nested->init_offset;
+ *expr = *nested;
+ expr->init_offset = offset;
+ }
+ }
+ }
+ return cost;
+}
+
static int expand_expression(struct expression *expr)
{
if (!expr)
@@ -776,7 +800,7 @@ static int expand_expression(struct expression *expr)
return expand_expression(expr->base) + 1;
case EXPR_POS:
- return expand_expression(expr->init_expr);
+ return expand_pos_expression(expr);
case EXPR_SIZEOF:
case EXPR_ALIGNOF: