diff options
| author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2004-09-23 15:49:26 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-07 21:03:19 -0700 |
| commit | 0413d55a587760cb4054beefbeca31dd253ed08c (patch) | |
| tree | dbc726cc2c627364bae4745298e1567bfc0b6f68 | |
| parent | 51d406d9b6be16bf4a456ab44d34984cbc80d1cc (diff) | |
| download | sparse-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.c | 26 |
1 files changed, 25 insertions, 1 deletions
@@ -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: |
