diff options
| author | hachem <im@hachem.wtf> | 2026-09-04 20:00:52 +0200 |
|---|---|---|
| committer | hachem <im@hachem.wtf> | 2026-09-04 20:00:52 +0200 |
| commit | 9283b46a08a1c58c321b6c7ebad1353725c3bc47 (patch) | |
| tree | 5fba917f42bdbaf86f27abc01577b3c1b232e409 /src/sema/sema.c | |
| parent | 56ba8b2a373dd1386950592bda9c68ff9f25c203 (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.c | 7 |
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: { |
