aboutsummaryrefslogtreecommitdiff
path: root/boot/name_analysis.cc
diff options
context:
space:
mode:
Diffstat (limited to 'boot/name_analysis.cc')
-rw-r--r--boot/name_analysis.cc128
1 files changed, 78 insertions, 50 deletions
diff --git a/boot/name_analysis.cc b/boot/name_analysis.cc
index 4a1a0ca..d5b2e91 100644
--- a/boot/name_analysis.cc
+++ b/boot/name_analysis.cc
@@ -278,9 +278,9 @@ namespace elna::boot
void forward_declaration_visitor::visit(unit *unit)
{
- for (type_declaration *const type : unit->types)
+ for (auto *const unit_declaration: unit->declarations)
{
- type->accept(this);
+ unit_declaration->accept(this);
}
}
@@ -296,6 +296,14 @@ namespace elna::boot
}
}
+ void forward_declaration_visitor::visit(variable_declaration *)
+ {
+ }
+
+ void forward_declaration_visitor::visit(procedure_declaration *)
+ {
+ }
+
resolving_visitor::resolving_visitor(symbol_bag& bag, const target_info& target,
const std::filesystem::path& module_path)
: bag(bag), constant_evaluator(this->bag, target), module_file(module_path)
@@ -502,41 +510,6 @@ namespace elna::boot
return type();
}
- void resolving_visitor::visit(variable_declaration *declaration)
- {
- const type variable_type = resolve_type(declaration->variable_type());
- std::optional<constant_value> computed;
-
- if (declaration->initializer != nullptr)
- {
- declaration->initializer->accept(this);
- computed = this->constant_evaluator.evaluate(*declaration->initializer);
-
- if (this->bag.is_global() && !computed.has_value())
- {
- add_error<non_constant_expression_error>(declaration->initializer->position(),
- non_constant_expression_error::initializer{ extract_identifiers(declaration->identifiers) });
- }
- }
- else if (!declaration->is_extern && resolve_aliases(variable_type).get<constant_type>() != nullptr)
- {
- auto position_span = source_position(
- declaration->identifiers.front().id().position().start(),
- declaration->identifiers.back().id().position().end());
- add_error<declaration_format_error>(position_span,
- declaration_format_error::not_initialized{ extract_identifiers(declaration->identifiers) });
- }
- for (const auto& variable_identifier : declaration->identifiers)
- {
- auto variable_symbol = register_variable(variable_identifier.name(),
- variable_type, declaration->position(), declaration->is_extern);
- variable_symbol->exported = variable_identifier.exported();
- variable_symbol->alignment =
- evaluate_attributes<attribute_kind::aligned>(variable_identifier.attributes).alignment;
- variable_symbol->value = computed;
- }
- }
-
std::vector<type> resolving_visitor::enter_parameters(const std::vector<identifier>& parameters)
{
std::vector<type> result;
@@ -1324,17 +1297,9 @@ namespace elna::boot
void declaration_visitor::visit(unit *unit)
{
- for (type_declaration *const type : unit->types)
+ for (declaration *const unit_declaration : unit->declarations)
{
- type->accept(this);
- }
- for (variable_declaration *const variable : unit->variables)
- {
- variable->accept(this);
- }
- for (procedure_declaration *const procedure : unit->procedures)
- {
- procedure->accept(this);
+ unit_declaration->accept(this);
}
if (unit->entry_point.has_value())
{
@@ -1422,6 +1387,41 @@ namespace elna::boot
}
}
+ void declaration_visitor::visit(variable_declaration *declaration)
+ {
+ const type variable_type = resolve_type(declaration->variable_type());
+ std::optional<constant_value> computed;
+
+ if (declaration->initializer != nullptr)
+ {
+ declaration->initializer->accept(this);
+ computed = this->constant_evaluator.evaluate(*declaration->initializer);
+
+ if (!computed.has_value())
+ {
+ add_error<non_constant_expression_error>(declaration->initializer->position(),
+ non_constant_expression_error::initializer{ extract_identifiers(declaration->identifiers) });
+ }
+ }
+ else if (!declaration->is_extern && resolve_aliases(variable_type).get<constant_type>() != nullptr)
+ {
+ auto position_span = source_position(
+ declaration->identifiers.front().id().position().start(),
+ declaration->identifiers.back().id().position().end());
+ add_error<declaration_format_error>(position_span,
+ declaration_format_error::not_initialized{ extract_identifiers(declaration->identifiers) });
+ }
+ for (const auto& variable_identifier : declaration->identifiers)
+ {
+ auto variable_symbol = register_variable(variable_identifier.name(),
+ variable_type, declaration->position(), declaration->is_extern);
+ variable_symbol->exported = variable_identifier.exported();
+ variable_symbol->alignment =
+ evaluate_attributes<attribute_kind::aligned>(variable_identifier.attributes).alignment;
+ variable_symbol->value = computed;
+ }
+ }
+
void declaration_visitor::visit(procedure_declaration *declaration)
{
// The scope is opened before the heading is built so that the type
@@ -1482,9 +1482,9 @@ namespace elna::boot
void name_analysis_visitor::visit(unit *unit)
{
- for (procedure_declaration *const procedure : unit->procedures)
+ for (declaration *const unit_declaration : unit->declarations)
{
- procedure->accept(this);
+ unit_declaration->accept(this);
}
if (unit->entry_point.has_value())
{
@@ -1498,7 +1498,35 @@ namespace elna::boot
void name_analysis_visitor::visit(type_declaration *)
{
- __builtin_unreachable();
+ }
+
+ void name_analysis_visitor::visit(variable_declaration *declaration)
+ {
+ if (!this->bag.is_global())
+ {
+ const type variable_type = resolve_type(declaration->variable_type());
+
+ if (declaration->initializer != nullptr)
+ {
+ declaration->initializer->accept(this);
+ }
+ else if (resolve_aliases(variable_type).get<constant_type>() != nullptr)
+ {
+ auto position_span = source_position(
+ declaration->identifiers.front().id().position().start(),
+ declaration->identifiers.back().id().position().end());
+ add_error<declaration_format_error>(position_span,
+ declaration_format_error::not_initialized{ extract_identifiers(declaration->identifiers) });
+ }
+ for (const auto& variable_identifier : declaration->identifiers)
+ {
+ auto variable_symbol = register_variable(variable_identifier.name(),
+ variable_type, declaration->position(), declaration->is_extern);
+ variable_symbol->exported = variable_identifier.exported();
+ variable_symbol->alignment =
+ evaluate_attributes<attribute_kind::aligned>(variable_identifier.attributes).alignment;
+ }
+ }
}
void name_analysis_visitor::visit(procedure_declaration *declaration)