aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
authorLinus Torvalds <torvalds@penguin.transmeta.com>2003-04-09 17:12:09 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-07 21:00:27 -0700
commit376facc6c4d03f6fdc3ed0ebc895ee1101a3f583 (patch)
treeb03f013c1be5d175ecf91ef0b74c7679d3a6cb36
parentf227bb2f4220fff66bd33334e3020cfe460e61f8 (diff)
downloadsparse-dev-376facc6c4d03f6fdc3ed0ebc895ee1101a3f583.tar.gz
Get member access vs member pointer dereference types right.
-rw-r--r--evaluate.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/evaluate.c b/evaluate.c
index ba01fb0a..80737016 100644
--- a/evaluate.c
+++ b/evaluate.c
@@ -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)) {