diff options
| author | Eugen Wissner <belka@caraus.de> | 2026-08-14 23:14:38 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2026-08-14 23:14:38 +0200 |
| commit | 33ae72a3c73f6219be86715e8da71ed345f6077c (patch) | |
| tree | 1c6c98be816508e9231fa1ada3f79ec940ab1cf1 /boot | |
| parent | d696abc97143061bf2abb05922188e12b59306c1 (diff) | |
| download | elna-33ae72a3c73f6219be86715e8da71ed345f6077c.tar.gz | |
Map Int and Word to hardware word sizes
Diffstat (limited to 'boot')
| -rw-r--r-- | boot/dependency.cc | 4 | ||||
| -rw-r--r-- | boot/driver.cc | 2 | ||||
| -rw-r--r-- | boot/evaluator.cc | 2 | ||||
| -rw-r--r-- | boot/materialization.cc | 20 | ||||
| -rw-r--r-- | boot/name_analysis.cc | 6 | ||||
| -rw-r--r-- | boot/result.cc | 6 | ||||
| -rw-r--r-- | boot/type_check.cc | 32 | ||||
| -rw-r--r-- | boot/validation.cc | 2 |
8 files changed, 34 insertions, 40 deletions
diff --git a/boot/dependency.cc b/boot/dependency.cc index bd1251a..4590513 100644 --- a/boot/dependency.cc +++ b/boot/dependency.cc @@ -62,7 +62,7 @@ namespace elna::boot return outcome; } - error_list analyze_semantics(std::unique_ptr<unit>& tree, symbol_bag& bag, + diagnostic_list analyze_semantics(std::unique_ptr<unit>& tree, symbol_bag& bag, const target_info& target) { name_analysis_visitor name_analyser(bag, target); @@ -86,7 +86,7 @@ namespace elna::boot { return std::move(validator.errors()); } - return error_list{}; + return diagnostic_list{}; } std::filesystem::path build_path(const std::vector<std::string>& segments) diff --git a/boot/driver.cc b/boot/driver.cc index 24a11fa..3607995 100644 --- a/boot/driver.cc +++ b/boot/driver.cc @@ -30,7 +30,7 @@ namespace elna::boot } syntax_error::syntax_error(const std::string& message, const yy::location& location) - : error(make_position(location)), message(message) + : diagnostic(make_position(location)), message(message) { } diff --git a/boot/evaluator.cc b/boot/evaluator.cc index 07b2953..b37d1fa 100644 --- a/boot/evaluator.cc +++ b/boot/evaluator.cc @@ -26,7 +26,7 @@ along with GCC; see the file COPYING3. If not see namespace elna::boot { non_constant_expression_error::non_constant_expression_error(const source_position position, payload_type payload) - : error(position), payload(std::move(payload)) + : diagnostic(position), payload(std::move(payload)) { } diff --git a/boot/materialization.cc b/boot/materialization.cc index e055dfd..8c436b3 100644 --- a/boot/materialization.cc +++ b/boot/materialization.cc @@ -20,7 +20,7 @@ along with GCC; see the file COPYING3. If not see namespace elna::boot { materialization_error::materialization_error(const source_position position) - : error(position) + : diagnostic(position) { } @@ -43,6 +43,11 @@ namespace elna::boot if (auto negated_literal = literal->value.negate()) { literal->value = negated_literal.value(); + if (!literal->has_explicit_size + && !literal->value.fit_into(true, target.int_properties.front().size)) + { + add_error<materialization_error>(literal->position()); + } } else { @@ -50,12 +55,23 @@ namespace elna::boot } break; case unmarked: - if (!literal->value.fit_into(true, literal->value.size())) + { + const auto target_size = literal->has_explicit_size + ? literal->value.size() + : target.int_properties.front().size; + + if (!literal->value.fit_into(true, target_size)) { add_error<materialization_error>(literal->position()); } break; + } case _unsigned: + if (!literal->has_explicit_size + && !literal->value.fit_into(false, target.word_properties.front().size)) + { + add_error<materialization_error>(literal->position()); + } break; } } diff --git a/boot/name_analysis.cc b/boot/name_analysis.cc index 4127466..0889ef9 100644 --- a/boot/name_analysis.cc +++ b/boot/name_analysis.cc @@ -24,7 +24,7 @@ along with GCC; see the file COPYING3. If not see namespace elna::boot { declaration_error::declaration_error(const source_position position, const std::string& name, payload_type payload) - : error(position), name(name), payload(payload) + : diagnostic(position), name(name), payload(payload) { } @@ -70,7 +70,7 @@ namespace elna::boot } const_qualifier_error::const_qualifier_error(const source_position position, payload_type payload) - : error(position), payload(std::move(payload)) + : diagnostic(position), payload(std::move(payload)) { } @@ -113,7 +113,7 @@ namespace elna::boot member_error::member_error(const source_position position, const std::string& name, const type& composite, payload_type payload) - : error(position), name(name), composite(composite), payload(std::move(payload)) + : diagnostic(position), name(name), composite(composite), payload(std::move(payload)) { } diff --git a/boot/result.cc b/boot/result.cc index a5f0803..3970b1f 100644 --- a/boot/result.cc +++ b/boot/result.cc @@ -63,17 +63,17 @@ namespace elna::boot return this->m_start != this->m_end; } - error::error(const source_position position) + diagnostic::diagnostic(const source_position position) : position(position) { } - std::deque<std::unique_ptr<error>>& error_container::errors() + std::deque<std::unique_ptr<diagnostic>>& diagnostic_container::errors() { return m_errors; } - bool error_container::has_errors() const + bool diagnostic_container::has_errors() const { return !m_errors.empty(); } diff --git a/boot/type_check.cc b/boot/type_check.cc index 07e563f..e58a50e 100644 --- a/boot/type_check.cc +++ b/boot/type_check.cc @@ -90,7 +90,7 @@ namespace elna::boot trait_error::trait_error(const source_position position, const std::string& trait_name, payload_type payload) - : error(position), trait_name(trait_name), payload(std::move(payload)) + : diagnostic(position), trait_name(trait_name), payload(std::move(payload)) { } @@ -115,7 +115,7 @@ namespace elna::boot type_mismatch_error::type_mismatch_error(const source_position position, type actual, payload_type payload) - : error(position), actual(std::move(actual)), payload(std::move(payload)) + : diagnostic(position), actual(std::move(actual)), payload(std::move(payload)) { } @@ -158,11 +158,6 @@ namespace elna::boot return "Type '" + this->actual.to_string() + "' cannot be converted to '" + payload.target.to_string() + "'"; } - else if constexpr (std::is_same_v<T, integer_literal_overflow>) - { - return "The number " + payload.overflow.to_string() - + " does not fit into the type '" + actual.to_string() + "'"; - } else if constexpr (std::is_same_v<T, constant_assignment>) { return "Cannot assign to a value of type '" + this->actual.to_string() @@ -173,7 +168,7 @@ namespace elna::boot type_requirement_error::type_requirement_error(const source_position position, type actual, kind kind) - : error(position), actual(std::move(actual)), m_kind(kind) + : diagnostic(position), actual(std::move(actual)), m_kind(kind) { } @@ -207,7 +202,7 @@ namespace elna::boot cyclic_declaration_error::cyclic_declaration_error(const source_position position, const std::vector<std::string>& cycle) - : error(position), cycle(cycle) + : diagnostic(position), cycle(cycle) { } @@ -226,7 +221,7 @@ namespace elna::boot argument_count_error::argument_count_error(const source_position position, kind kind, std::string applicand, std::size_t expected, std::size_t actual) - : error(position), m_kind(kind), applicand(std::move(applicand)), expected(expected), actual(actual) + : diagnostic(position), m_kind(kind), applicand(std::move(applicand)), expected(expected), actual(actual) { } @@ -1059,21 +1054,4 @@ namespace elna::boot } } - void type_analysis_visitor::visit(literal<integer_literal> *expression) - { - bool narrowed{ false }; - if (expression->value.is_signed()) - { - narrowed = expression->value.fit_into(target.int_properties.front().size); - } - else - { - narrowed = expression->value.fit_into(target.word_properties.front().size); - } - if (!narrowed) - { - add_error<type_mismatch_error>(expression->position(), expression->type_decoration, - type_mismatch_error::integer_literal_overflow{ expression->value }); - } - } } diff --git a/boot/validation.cc b/boot/validation.cc index 26d4f64..a81282b 100644 --- a/boot/validation.cc +++ b/boot/validation.cc @@ -22,7 +22,7 @@ along with GCC; see the file COPYING3. If not see namespace elna::boot { validation_error::validation_error(const source_position position, source_position first) - : error(position), first(first) + : diagnostic(position), first(first) { } |
