/* 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 . */ #include "elna/boot/materialization.h" namespace elna::boot { materialization_error::materialization_error(const source_position position) : diagnostic(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 *literal) { switch (literal->wants_signed) { using enum integer_sign; case negative: 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(literal->position()); } } else { add_error(literal->position()); } break; case unmarked: { 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(literal->position()); } break; } case _unsigned: if (!literal->has_explicit_size && !literal->value.fit_into(false, target.word_properties.front().size)) { add_error(literal->position()); } break; } } }