From 1e0f89df48ba10cdde80bd623b84e20fb48b977d Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Fri, 24 Jul 2026 21:28:33 +0200 Subject: Accept any constant types in case labels --- boot/evaluator.cc | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) (limited to 'boot/evaluator.cc') diff --git a/boot/evaluator.cc b/boot/evaluator.cc index 4b37668..40a6533 100644 --- a/boot/evaluator.cc +++ b/boot/evaluator.cc @@ -61,25 +61,32 @@ namespace elna::boot } else if (auto *record_constructor = subject.is_record_constructor()) { + ordered_map aggregate; + for (const field_initializer& field_initializer : record_constructor->field_initializers) { - if (!evaluate(field_initializer.value())) + auto value = evaluate(field_initializer.value()); + if (!value) { return std::nullopt; } + aggregate.insert(field_initializer.name(), std::move(*value)); } - return constant_value{ compound_constant{} }; + return constant_value{ constant_aggregate{ std::move(aggregate) } }; } else if (auto *array_constructor = subject.is_array_constructor()) { + std::vector elements; for (expression *element : array_constructor->elements) { - if (!evaluate(*element)) + auto value = evaluate(*element); + if (!value) { return std::nullopt; } + elements.push_back(std::move(*value)); } - return constant_value{ compound_constant{} }; + return constant_value{ constant_aggregate{ std::move(elements) } }; } return std::nullopt; } @@ -171,7 +178,7 @@ namespace elna::boot } if (subject.operation() == unary_operator::logical_negation) { - return std::visit([](auto value) -> std::optional { + return std::visit([](const auto& value) -> std::optional { using T = std::decay_t; if constexpr (std::is_same_v) @@ -183,7 +190,7 @@ namespace elna::boot } if (subject.operation() == unary_operator::bitwise_negation) { - return std::visit([](auto value) -> std::optional { + return std::visit([](const auto& value) -> std::optional { using T = std::decay_t; if constexpr (std::is_integral_v && !std::is_same_v) @@ -240,10 +247,11 @@ namespace elna::boot } template - static std::optional evaluate_operation(binary_operator operation, T lhs, T rhs) + static std::optional evaluate_operation(binary_operator operation, const T& lhs, const T& rhs) { if constexpr (std::is_same_v - || std::is_same_v) + || std::is_same_v> + || std::is_same_v>) { switch (operation) { -- cgit v1.2.3