aboutsummaryrefslogtreecommitdiff
path: root/boot/validation.cc
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2026-09-18 12:19:13 +0200
committerEugen Wissner <belka@caraus.de>2026-09-18 12:19:13 +0200
commitdc9d03915c4b169fec749081b45d56f722105813 (patch)
tree0a0719bc95f942b675fb52865d9c5bac9e105767 /boot/validation.cc
parentb575036fe804f14b78da74897a74b010cc94f730 (diff)
downloadelna-dc9d03915c4b169fec749081b45d56f722105813.tar.gz
Allow block-local variables
Diffstat (limited to 'boot/validation.cc')
-rw-r--r--boot/validation.cc29
1 files changed, 18 insertions, 11 deletions
diff --git a/boot/validation.cc b/boot/validation.cc
index e628cd8..facef04 100644
--- a/boot/validation.cc
+++ b/boot/validation.cc
@@ -49,6 +49,13 @@ namespace elna::boot
}
}
+ void validation_visitor::visit_block(const block& body)
+ {
+ this->bag.enter(body.symbols);
+ visit_statements(body.statements);
+ this->bag.leave();
+ }
+
void validation_visitor::visit(unit *unit)
{
for (declaration *unit_declaration : unit->declarations)
@@ -88,11 +95,11 @@ namespace elna::boot
{
for (const switch_case& case_block : statement->cases)
{
- visit_statements(case_block.statements);
+ visit_block(case_block.body);
}
if (statement->alternative != nullptr)
{
- visit_statements(*statement->alternative);
+ visit_block(*statement->alternative);
}
std::unordered_map<constant_value, source_position, constant_value_hash> seen;
@@ -122,44 +129,44 @@ namespace elna::boot
void validation_visitor::visit(if_statement *statement)
{
- visit_statements(statement->branch().statements);
+ visit_block(statement->branch().body);
for (const conditional_statements *branch : statement->branches)
{
- visit_statements(branch->statements);
+ visit_block(branch->body);
}
if (statement->alternative != nullptr)
{
- visit_statements(*statement->alternative);
+ visit_block(*statement->alternative);
}
}
void validation_visitor::visit(while_statement *statement)
{
- visit_statements(statement->branch().statements);
+ visit_block(statement->branch().body);
for (const conditional_statements *branch : statement->branches)
{
- visit_statements(branch->statements);
+ visit_block(branch->body);
}
}
void validation_visitor::visit(repeat_statement *statement)
{
- visit_statements(statement->body);
+ visit_block(statement->body);
}
void validation_visitor::visit(for_statement *statement)
{
- visit_statements(statement->body);
+ visit_block(statement->body);
}
void validation_visitor::visit(defer_statement *statement)
{
- visit_statements(statement->statements);
+ visit_block(statement->body);
}
void validation_visitor::visit(block_statement *statement)
{
- visit_statements(statement->statements);
+ visit_block(statement->body);
}
void validation_visitor::visit(break_statement *)