From 61531e58066e4d803624ab2c6dac84445fb75e59 Mon Sep 17 00:00:00 2001 From: Carson Fleming Date: Thu, 30 Jul 2026 00:20:30 -0400 Subject: casting --- type_checker.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) (limited to 'type_checker.c') diff --git a/type_checker.c b/type_checker.c index 86fe63a..0aaa584 100644 --- a/type_checker.c +++ b/type_checker.c @@ -81,13 +81,23 @@ static void type_check_decl_list(struct decl_list_node* node) { type_check_decl(&node->type, cur); } -static const struct type* resolve_assign(struct assign_node* node) { - switch (node->lval->type) { +static bool is_expr_assignable(struct expr_node* node) { + switch (node->type) { case EXPR_VAR_REF: - break; + return true; + case EXPR_PAREN: + const struct expr_list_node* expr_list = + node->inner.paren.expr_list; + return expr_list->next == NULL + && is_expr_assignable(expr_list->expr); default: - TYPE_PANIC("expression is not assignable"); + return false; } +} + +static const struct type* resolve_assign(struct assign_node* node) { + if (!is_expr_assignable(node->lval)) + TYPE_PANIC("expression is not assignable"); type_check_expr(node->lval); type_check_expr(node->rval); @@ -146,6 +156,12 @@ static const struct type* resolve_paren(struct paren_node* node) { return node->expr_list->resolved_type; } +static const struct type* resolve_cast(struct cast_node* node) { + type_check_expr(node->expr); + assert_cast_compatible(&node->type, node->expr->resolved_type); + return &node->type; +} + static void type_check_expr(struct expr_node* node) { switch (node->type) { case EXPR_INT_LIT: @@ -178,6 +194,9 @@ static void type_check_expr(struct expr_node* node) { case EXPR_PAREN: node->resolved_type = resolve_paren(&node->inner.paren); break; + case EXPR_CAST: + node->resolved_type = resolve_cast(&node->inner.cast); + break; } } -- cgit v1.2.3