aboutsummaryrefslogtreecommitdiff
path: root/src/sema
diff options
context:
space:
mode:
Diffstat (limited to 'src/sema')
-rw-r--r--src/sema/sema.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/sema/sema.c b/src/sema/sema.c
index ad2b12a..fb53bbf 100644
--- a/src/sema/sema.c
+++ b/src/sema/sema.c
@@ -227,6 +227,19 @@ static void check_expr(struct RefCheck* check, struct Expr* expr)
check_expr(check, expr->binary.left);
check_expr(check, expr->binary.right);
break;
+ case EXPR_DEREF:
+ {
+ struct Expr* address = expr->deref.address;
+ if (address->kind == EXPR_PRIMARY
+ && (is_register(check, address->primary.token) || is_param(check, address->primary.token)))
+ break;
+
+ if (address->kind == EXPR_PRIMARY)
+ ref_error(check, address->primary.token, "dereference address must be a register");
+ else
+ check_expr(check, address);
+ break;
+ }
case EXPR_MEMBER:
{
struct Expr* object = expr->member.object;