summaryrefslogtreecommitdiff
path: root/src/hir_conv/constant_evaluation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/hir_conv/constant_evaluation.cpp')
-rw-r--r--src/hir_conv/constant_evaluation.cpp39
1 files changed, 21 insertions, 18 deletions
diff --git a/src/hir_conv/constant_evaluation.cpp b/src/hir_conv/constant_evaluation.cpp
index 0b54331c..f23d8e65 100644
--- a/src/hir_conv/constant_evaluation.cpp
+++ b/src/hir_conv/constant_evaluation.cpp
@@ -63,11 +63,7 @@ namespace {
return ::HIR::Literal( mv$(vals) );
),
(Variant,
- ::std::vector< ::HIR::Literal> vals;
- for(const auto& val : e.vals) {
- vals.push_back( clone_literal(val) );
- }
- return ::HIR::Literal::make_Variant({ e.idx, mv$(vals) });
+ return ::HIR::Literal::make_Variant({ e.idx, box$(clone_literal(*e.val)) });
),
(Integer,
return ::HIR::Literal(e);
@@ -595,11 +591,11 @@ namespace {
ASSERT_BUG(node.span(), ent.is_Enum(), "_TupleVariant with m_is_struct clear pointing to " << ent.tag_str());
const auto& enm = ent.as_Enum();
- auto it = ::std::find_if( enm.m_variants.begin(), enm.m_variants.end(), [&](const auto&x){ return x.first == varname; } );
- ASSERT_BUG(node.span(), it != enm.m_variants.end(), "_TupleVariant points to unknown variant - " << node.m_path);
- unsigned int var_idx = it - enm.m_variants.begin();
+ auto var_idx = enm.find_variant(varname);
+ ASSERT_BUG(node.span(), var_idx != SIZE_MAX, "_TupleVariant points to unknown variant - " << node.m_path);
- m_rv = ::HIR::Literal::make_Variant({var_idx, mv$(vals)});
+ auto inner = box$( ::HIR::Literal::make_List(mv$(vals)) );
+ m_rv = ::HIR::Literal::make_Variant({ static_cast<unsigned>(var_idx), mv$(inner) });
m_rv_type = ::HIR::TypeRef::new_path( mv$(tmp_path), ::HIR::TypeRef::TypePathBinding(&enm) );
}
}
@@ -766,11 +762,10 @@ namespace {
ASSERT_BUG(node.span(), ent.is_Enum(), "_UnitVariant with m_is_struct clear pointing to " << ent.tag_str());
const auto& enm = ent.as_Enum();
- auto it = ::std::find_if( enm.m_variants.begin(), enm.m_variants.end(), [&](const auto&x){ return x.first == varname; } );
- ASSERT_BUG(node.span(), it != enm.m_variants.end(), "_UnitVariant points to unknown variant - " << node.m_path);
- unsigned int var_idx = it - enm.m_variants.begin();
+ auto var_idx = enm.find_variant(varname);
+ ASSERT_BUG(node.span(), var_idx != SIZE_MAX, "_UnitVariant points to unknown variant - " << node.m_path);
- m_rv = ::HIR::Literal::make_Variant({var_idx, {}});
+ m_rv = ::HIR::Literal::make_Variant({ static_cast<unsigned>(var_idx), box$(::HIR::Literal::make_List({})) });
m_rv_type = ::HIR::TypeRef::new_path( mv$(tmp_path), ::HIR::TypeRef::TypePathBinding(&enm) );
}
}
@@ -1604,12 +1599,20 @@ namespace {
}
}
void visit_enum(::HIR::ItemPath p, ::HIR::Enum& item) override {
- for(auto& var : item.m_variants)
+ if( auto* e = item.m_data.opt_Value() )
{
- TU_IFLET(::HIR::Enum::Variant, var.second, Value, e,
- e.val = evaluate_constant(e.expr->span(), m_crate, NewvalState { m_new_values, *m_mod_path, FMT(p.get_name() << "$" << var.first << "$") }, e.expr, {});
- DEBUG("enum variant: " << p << "::" << var.first << " = " << e.val);
- )
+ uint64_t i = 0;
+ for(auto& var : e->variants)
+ {
+ if( var.expr )
+ {
+ auto val = evaluate_constant(var.expr->span(), m_crate, NewvalState { m_new_values, *m_mod_path, FMT(p.get_name() << "$" << var.name << "$") }, var.expr, {});
+ DEBUG("enum variant: " << p << "::" << var.name << " = " << val);
+ i = val.as_Integer();
+ }
+ var.val = i;
+ i ++;
+ }
}
::HIR::Visitor::visit_enum(p, item);
}