diff options
Diffstat (limited to 'boot/materialization.cc')
| -rw-r--r-- | boot/materialization.cc | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/boot/materialization.cc b/boot/materialization.cc new file mode 100644 index 0000000..e055dfd --- /dev/null +++ b/boot/materialization.cc @@ -0,0 +1,62 @@ +/* Literal sign folding. + Copyright (C) 2025 Free Software Foundation, Inc. + +GCC is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3, or (at your option) +any later version. + +GCC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +<http://www.gnu.org/licenses/>. */ + +#include "elna/boot/materialization.h" + +namespace elna::boot +{ + materialization_error::materialization_error(const source_position position) + : error(position) + { + } + + std::string materialization_error::what() const + { + return "Integer literal overflows"; + } + + materialization_visitor::materialization_visitor(const target_info& target) + : target(target) + { + } + + void materialization_visitor::visit(literal<integer_literal> *literal) + { + switch (literal->wants_signed) + { + using enum integer_sign; + case negative: + if (auto negated_literal = literal->value.negate()) + { + literal->value = negated_literal.value(); + } + else + { + add_error<materialization_error>(literal->position()); + } + break; + case unmarked: + if (!literal->value.fit_into(true, literal->value.size())) + { + add_error<materialization_error>(literal->position()); + } + break; + case _unsigned: + break; + } + } +} |
