diff options
| author | Linus Torvalds <torvalds@penguin.transmeta.com> | 2003-04-09 17:12:09 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-07 21:00:27 -0700 |
| commit | 376facc6c4d03f6fdc3ed0ebc895ee1101a3f583 (patch) | |
| tree | b03f013c1be5d175ecf91ef0b74c7679d3a6cb36 | |
| parent | f227bb2f4220fff66bd33334e3020cfe460e61f8 (diff) | |
| download | sparse-dev-376facc6c4d03f6fdc3ed0ebc895ee1101a3f583.tar.gz | |
Get member access vs member pointer dereference types right.
| -rw-r--r-- | evaluate.c | 14 |
1 files changed, 9 insertions, 5 deletions
@@ -1046,22 +1046,26 @@ static struct symbol *evaluate_member_dereference(struct expression *expr) } ctype = deref->ctype; - if (ctype->type == SYM_NODE) - ctype = ctype->ctype.base_type; - mod = ctype->ctype.modifiers; address_space = ctype->ctype.as; + mod = ctype->ctype.modifiers; + if (ctype->type == SYM_NODE) { + ctype = ctype->ctype.base_type; + address_space |= ctype->ctype.as; + mod |= ctype->ctype.modifiers; + } if (expr->op == SPECIAL_DEREFERENCE) { /* Arrays will degenerate into pointers for '->' */ if (ctype->type != SYM_PTR && ctype->type != SYM_ARRAY) { warn(expr->pos, "expected a pointer to a struct/union"); return NULL; } + mod = ctype->ctype.modifiers; address_space = ctype->ctype.as; ctype = ctype->ctype.base_type; - mod |= ctype->ctype.modifiers; if (ctype->type == SYM_NODE) { - ctype = ctype->ctype.base_type; mod |= ctype->ctype.modifiers; + address_space |= ctype->ctype.as; + ctype = ctype->ctype.base_type; } } else { if (!lvalue_expression(deref)) { |
