diff options
| author | Eugen Wissner <belka@caraus.de> | 2026-08-21 00:05:03 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2026-08-21 00:05:03 +0200 |
| commit | 39269cc68a32f6e1a7524b00da36a1fe4cc7fb8b (patch) | |
| tree | 9558cd6107d60e22127faeddbdeac5031ee2fdbe /boot/materialization.cc | |
| parent | 4f77ad5d019618893c59a0f8d5bfa6b98e50a3be (diff) | |
| download | elna-39269cc68a32f6e1a7524b00da36a1fe4cc7fb8b.tar.gz | |
Implement Single and Double floats
Diffstat (limited to 'boot/materialization.cc')
| -rw-r--r-- | boot/materialization.cc | 35 |
1 files changed, 28 insertions, 7 deletions
diff --git a/boot/materialization.cc b/boot/materialization.cc index 8c436b3..4b58ac2 100644 --- a/boot/materialization.cc +++ b/boot/materialization.cc @@ -19,14 +19,22 @@ along with GCC; see the file COPYING3. If not see namespace elna::boot { - materialization_error::materialization_error(const source_position position) - : diagnostic(position) + materialization_error::materialization_error(const source_position position, kind error_kind) + : diagnostic(position), m_kind(error_kind) { } std::string materialization_error::what() const { - return "Integer literal overflows"; + switch (this->m_kind) + { + using enum kind; + case integer_overflow: + return "Integer literal overflows"; + case real_overflow: + return "Real literal overflows"; + } + __builtin_unreachable(); } materialization_visitor::materialization_visitor(const target_info& target) @@ -46,12 +54,14 @@ namespace elna::boot if (!literal->has_explicit_size && !literal->value.fit_into(true, target.int_properties.front().size)) { - add_error<materialization_error>(literal->position()); + add_error<materialization_error>(literal->position(), + materialization_error::kind::integer_overflow); } } else { - add_error<materialization_error>(literal->position()); + add_error<materialization_error>(literal->position(), + materialization_error::kind::integer_overflow); } break; case unmarked: @@ -62,7 +72,8 @@ namespace elna::boot if (!literal->value.fit_into(true, target_size)) { - add_error<materialization_error>(literal->position()); + add_error<materialization_error>(literal->position(), + materialization_error::kind::integer_overflow); } break; } @@ -70,9 +81,19 @@ namespace elna::boot if (!literal->has_explicit_size && !literal->value.fit_into(false, target.word_properties.front().size)) { - add_error<materialization_error>(literal->position()); + add_error<materialization_error>(literal->position(), + materialization_error::kind::integer_overflow); } break; } } + + void materialization_visitor::visit(literal<float_literal> *literal) + { + if (!literal->value.is_finite()) + { + add_error<materialization_error>(literal->position(), + materialization_error::kind::real_overflow); + } + } } |
