From 7440060f179e35fe63155a149bb5003c97e12013 Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Sun, 18 Oct 2026 09:25:36 +0200 Subject: Fix ICE on variable declarations in case branches --- boot/type_check.cc | 42 ++++++++++++------------------------------ 1 file changed, 12 insertions(+), 30 deletions(-) (limited to 'boot/type_check.cc') diff --git a/boot/type_check.cc b/boot/type_check.cc index 5a8170a..5033ffd 100644 --- a/boot/type_check.cc +++ b/boot/type_check.cc @@ -494,9 +494,8 @@ namespace elna::boot return is_assignable_from(left, right) || is_assignable_from(right, left); } - void type_analysis_visitor::visit_and_validate_condition(expression& condition) + void type_analysis_visitor::validate_condition(const expression& condition) { - condition.accept(this); if (!is_primitive_type(condition.type_decoration, "Bool")) { add_error(condition.position(), @@ -824,7 +823,7 @@ namespace elna::boot void type_analysis_visitor::visit(for_statement *statement) { - statement->range().accept(this); + walking_visitor::visit(statement); const type resolved_range = resolve_underlying_type(statement->range().type_decoration); if (!get_range_base_type(resolved_range)) @@ -832,47 +831,40 @@ namespace elna::boot add_error(statement->range().position(), statement->range().type_decoration, type_requirement_error::kind::for_range); } - traverse_block(statement->body); } - void type_analysis_visitor::traverse_block(block& body) + void type_analysis_visitor::traverse_block(const block& body) { this->bag.enter(body.symbols); - boot::traverse_block(this, body); + walking_visitor::traverse_block(body); this->bag.leave(); } void type_analysis_visitor::visit(repeat_statement *statement) { - visit_and_validate_condition(statement->condition()); - traverse_block(statement->body); + walking_visitor::visit(statement); + validate_condition(statement->condition()); } void type_analysis_visitor::visit(while_statement *statement) { - visit_and_validate_condition(statement->branch().prerequisite()); - traverse_block(statement->branch().body); + walking_visitor::visit(statement); + validate_condition(statement->branch().prerequisite()); for (conditional_statements& branch : statement->branches) { - visit_and_validate_condition(branch.prerequisite()); - traverse_block(branch.body); + validate_condition(branch.prerequisite()); } } void type_analysis_visitor::visit(if_statement *statement) { - visit_and_validate_condition(statement->branch().prerequisite()); - traverse_block(statement->branch().body); + walking_visitor::visit(statement); + validate_condition(statement->branch().prerequisite()); for (conditional_statements& branch : statement->branches) { - visit_and_validate_condition(branch.prerequisite()); - traverse_block(branch.body); - } - if (statement->alternative != nullptr) - { - traverse_block(*statement->alternative); + validate_condition(branch.prerequisite()); } } @@ -1462,16 +1454,6 @@ namespace elna::boot } // else callable is not declared, or inference failed and reported. } - - void type_analysis_visitor::visit(defer_statement *statement) - { - traverse_block(statement->body); - } - - void type_analysis_visitor::visit(block_statement *statement) - { - traverse_block(statement->body); - } void type_analysis_visitor::visit(record_constructor_expression *expression) { -- cgit v1.2.3