aboutsummaryrefslogtreecommitdiff
path: root/src/sema/sema.c
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2026-08-31 16:56:40 +0200
committerhachem <im@hachem.wtf>2026-08-31 16:56:40 +0200
commit53aed3fadf1f7ad66dea9a8a0b46bf42eda921be (patch)
treeea14a08b29a18072d1e420353a39c1397f85bee2 /src/sema/sema.c
parentf8a2d02c75df62f74e5907696d5a99a024d59018 (diff)
feat: add memory loads via ^reg
Diffstat (limited to 'src/sema/sema.c')
-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;