aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--expr.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/expr.c b/expr.c
index 5973f67..a1834c5 100644
--- a/expr.c
+++ b/expr.c
@@ -479,6 +479,7 @@ postfixexpr(struct scope *s, struct expression *r)
/* fallthrough */
case TARROW:
op = tok.kind;
+ lvalueconvert(r);
if (r->type->kind != TYPEPOINTER)
error(&tok.loc, "arrow operator must be applied to pointer to struct/union");
tq = QUALNONE;
@@ -556,6 +557,7 @@ unaryexpr(struct scope *s)
case TMUL:
next();
l = castexpr(s);
+ lvalueconvert(l);
if (l->type->kind != TYPEPOINTER)
error(&tok.loc, "cannot dereference non-pointer");
e = mkexpr(EXPRUNARY, l->type->base, EXPRFLAG_LVAL);
@@ -823,6 +825,7 @@ assignexpr(struct scope *s)
}
next();
r = assignexpr(s);
+ lvalueconvert(r);
if (op) {
/* rewrite `E1 OP= E2` as `T = &E1, *T = *T OP E2`, where T is a temporary slot */
tmp = mkexpr(EXPRTEMP, mkpointertype(l->type), EXPRFLAG_LVAL);