aboutsummaryrefslogtreecommitdiff
path: root/src/sema/sema.c
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2026-09-04 20:00:52 +0200
committerhachem <im@hachem.wtf>2026-09-04 20:00:52 +0200
commit9283b46a08a1c58c321b6c7ebad1353725c3bc47 (patch)
tree5fba917f42bdbaf86f27abc01577b3c1b232e409 /src/sema/sema.c
parent56ba8b2a373dd1386950592bda9c68ff9f25c203 (diff)
feat: add if/else blocks
if now guards a { } block or bare statement with an optional else (and now else-if chaining). The branch body becomes a statement list; a bare guarded statement is a list of length one.
Diffstat (limited to 'src/sema/sema.c')
-rw-r--r--src/sema/sema.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/sema/sema.c b/src/sema/sema.c
index 4b4bc26..6505077 100644
--- a/src/sema/sema.c
+++ b/src/sema/sema.c
@@ -32,7 +32,7 @@ static bool check_duplicate_names(struct Source source, struct Program* program)
if (count == 0)
return true;
- struct Token* names = malloc(count * sizeof(struct Token));
+ struct Token* names = malloc(count * sizeof(*names));
if (names == NULL)
return true;
size_t n = 0;
@@ -449,7 +449,10 @@ static void check_statement(struct RefCheck* check, struct Statement* statement)
case STATEMENT_IF:
check_expr(check, statement->branch.left);
check_expr(check, statement->branch.right);
- check_statement(check, statement->branch.body);
+ for (size_t i = 0; i < statement->branch.body_count; i += 1)
+ check_statement(check, &statement->branch.body[i]);
+ for (size_t i = 0; i < statement->branch.else_count; i += 1)
+ check_statement(check, &statement->branch.else_body[i]);
break;
case STATEMENT_CALL:
{