aboutsummaryrefslogtreecommitdiff
path: root/boot/materialization.cc
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2026-08-21 00:05:03 +0200
committerEugen Wissner <belka@caraus.de>2026-08-21 00:05:03 +0200
commit39269cc68a32f6e1a7524b00da36a1fe4cc7fb8b (patch)
tree9558cd6107d60e22127faeddbdeac5031ee2fdbe /boot/materialization.cc
parent4f77ad5d019618893c59a0f8d5bfa6b98e50a3be (diff)
downloadelna-39269cc68a32f6e1a7524b00da36a1fe4cc7fb8b.tar.gz
Implement Single and Double floats
Diffstat (limited to 'boot/materialization.cc')
-rw-r--r--boot/materialization.cc35
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);
+ }
+ }
}