summaryrefslogtreecommitdiff
path: root/src/trans/enumerate.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/trans/enumerate.cpp')
-rw-r--r--src/trans/enumerate.cpp55
1 files changed, 15 insertions, 40 deletions
diff --git a/src/trans/enumerate.cpp b/src/trans/enumerate.cpp
index 283617f2..757b368d 100644
--- a/src/trans/enumerate.cpp
+++ b/src/trans/enumerate.cpp
@@ -424,22 +424,12 @@ namespace {
return x;
}
};
- for(const auto& variant : item.m_variants)
+ if( const auto* e = item.m_data.opt_Data() )
{
- TU_MATCHA( (variant.second), (e),
- (Unit,
- ),
- (Value,
- ),
- (Tuple,
- for(const auto& ty : e)
- visit_type( monomorph(ty.ent) );
- ),
- (Struct,
- for(const auto& fld : e)
- visit_type( monomorph(fld.second.ent) );
- )
- )
+ for(const auto& variant : *e)
+ {
+ visit_type( monomorph(variant.type) );
+ }
}
}
@@ -810,30 +800,16 @@ void Trans_Enumerate_Types(EnumState& state)
tv.m_resolve.expand_associated_types(sp, rv);
return rv;
};
- const auto& variants = enm.m_variants;
+ ASSERT_BUG(Span(), enm.m_data.is_Data(), "");
+ const auto& variants = enm.m_data.as_Data();
ASSERT_BUG(Span(), e.variant_index < variants.size(), "Variant index out of range");
- const auto& variant = variants[e.variant_index];
- // TODO: Make data variants refer to associated types (unify enum and struct handling)
- TU_MATCHA( (variant.second), (ve),
- (Value,
- ),
- (Unit,
- ),
- (Tuple,
- // HACK! Create tuple.
- ::std::vector< ::HIR::TypeRef> tys;
- for(const auto& fld : ve)
- tys.push_back( monomorph(fld.ent) );
- return *tmp_ty_ptr = ::HIR::TypeRef( mv$(tys) );
- ),
- (Struct,
- // HACK! Create tuple.
- ::std::vector< ::HIR::TypeRef> tys;
- for(const auto& fld : ve)
- tys.push_back( monomorph(fld.second.ent) );
- return *tmp_ty_ptr = ::HIR::TypeRef( mv$(tys) );
- )
- )
+ const auto& raw_ty = variants[e.variant_index].type;
+ if( monomorphise_type_needed(raw_ty) ) {
+ return *tmp_ty_ptr = monomorph(raw_ty);
+ }
+ else {
+ return raw_ty;
+ }
}
else
{
@@ -1553,8 +1529,7 @@ void Trans_Enumerate_FillFrom_Literal(EnumState& state, const ::HIR::Literal& li
Trans_Enumerate_FillFrom_Literal(state, v, pp);
),
(Variant,
- for(const auto& v : e.vals)
- Trans_Enumerate_FillFrom_Literal(state, v, pp);
+ Trans_Enumerate_FillFrom_Literal(state, *e.val, pp);
),
(Integer,
),