summaryrefslogtreecommitdiff
path: root/src/mir/from_hir_match.cpp
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-08-11 23:28:37 +0800
committerJohn Hodge <tpg@mutabah.net>2016-08-11 23:28:37 +0800
commit6d23db9debb5d0892bb392713e4154e50fb4cd7b (patch)
tree58793dd5ec5ee446e55fc1bac62174449d0ec671 /src/mir/from_hir_match.cpp
parented55ea67f78fc8be0d9a8f7949f404f52ec71205 (diff)
downloadmrust-6d23db9debb5d0892bb392713e4154e50fb4cd7b.tar.gz
MIR Match - Handling of EnumTuple in Simple
Diffstat (limited to 'src/mir/from_hir_match.cpp')
-rw-r--r--src/mir/from_hir_match.cpp42
1 files changed, 38 insertions, 4 deletions
diff --git a/src/mir/from_hir_match.cpp b/src/mir/from_hir_match.cpp
index 6e418fc7..77fa3bc0 100644
--- a/src/mir/from_hir_match.cpp
+++ b/src/mir/from_hir_match.cpp
@@ -158,8 +158,7 @@ void MIR_LowerHIR_Match_Simple( MirBuilder& builder, MirConverter& conv, ::HIR::
builder.set_cur_block( next_pattern_bb );
}
}
-
- builder.set_cur_block( arm_cmp_blocks.back() );
+ // - Kill the final pattern block (which is dead code)
builder.end_block( ::MIR::Terminator::make_Diverge({}) );
builder.set_cur_block( next_block );
@@ -205,7 +204,43 @@ void MIR_LowerHIR_Match_Simple__GeneratePattern( MirBuilder& builder, const Span
TODO(sp, "EnumValue");
),
(EnumTuple,
- TODO(sp, "EnumTuple");
+ // Switch (or if) on the variant, then recurse
+ auto next_bb = builder.new_bb_unlinked();
+ auto var_count = pe.binding_ptr->m_variants.size();
+ auto var_idx = pe.binding_idx;
+ ::std::vector< ::MIR::BasicBlockId> arms(var_count, fail_bb);
+ arms[var_idx] = next_bb;
+ builder.end_block( ::MIR::Terminator::make_Switch({ match_val.clone(), mv$(arms) }) );
+
+ builder.set_cur_block(next_bb);
+ TU_MATCHA( (pe.binding_ptr->m_variants[var_idx].second), (var),
+ (Unit,
+ BUG(sp, "EnumTuple pattern with Unit enum variant");
+ ),
+ (Value,
+ BUG(sp, "EnumTuple pattern with Value enum variant");
+ ),
+ (Tuple,
+ auto lval_var = ::MIR::LValue::make_Downcast({ box$(match_val.clone()), var_idx });
+ assert( pe.sub_patterns.size() == var.size() );
+ for(unsigned int i = 0; i < var.size(); i ++)
+ {
+ auto lval = ::MIR::LValue::make_Field({ box$(lval_var.clone()), i });
+ const auto& ty = var[i].ent;
+ const auto& pat = pe.sub_patterns[i];
+ if( monomorphise_type_needed(ty) ) {
+ auto ty_mono = monomorphise_type(sp, pe.binding_ptr->m_params, pe.path.m_params, ty);
+ MIR_LowerHIR_Match_Simple__GeneratePattern(builder, sp, pat, ty_mono, mv$(lval), fail_bb);
+ }
+ else {
+ MIR_LowerHIR_Match_Simple__GeneratePattern(builder, sp, pat, ty, mv$(lval), fail_bb);
+ }
+ }
+ ),
+ (Struct,
+ BUG(sp, "EnumTuple pattern with Named enum variant");
+ )
+ )
),
(EnumTupleWildcard,
TODO(sp, "EnumTupleWildcard");
@@ -220,7 +255,6 @@ void MIR_LowerHIR_Match_Simple__GeneratePattern( MirBuilder& builder, const Span
TODO(sp, "SplitSlice");
)
)
- TODO(sp, "Convert match on pattern " << pat << " into MIR");
}
// --------------------------------------------------------------------