diff options
author | John Hodge <tpg@mutabah.net> | 2016-09-08 09:57:23 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-09-08 09:57:23 +0800 |
commit | 00662f7843b658eceb85b2fb182212cacc5615cc (patch) | |
tree | efc4bd3f8e31a82580d5100d091934e7e50550cb /src | |
parent | abc5759934306a55ba25016eeed9a522d81f20d3 (diff) | |
download | mrust-00662f7843b658eceb85b2fb182212cacc5615cc.tar.gz |
MIR Gen Match - Support char ranges in Simple
Diffstat (limited to 'src')
-rw-r--r-- | src/mir/from_hir_match.cpp | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/mir/from_hir_match.cpp b/src/mir/from_hir_match.cpp index 1f087da8..d9c33d5f 100644 --- a/src/mir/from_hir_match.cpp +++ b/src/mir/from_hir_match.cpp @@ -339,7 +339,22 @@ int MIR_LowerHIR_Match_Simple__GeneratePattern(MirBuilder& builder, const Span& builder.set_cur_block(succ_bb); ), (ValueRange, - TODO(sp, "Simple match over char - ValueRange"); + auto succ_bb = builder.new_bb_unlinked(); + auto test_bb_2 = builder.new_bb_unlinked(); + + // IF `match_val` < `first` : fail_bb + auto test_lt_lval = builder.lvalue_or_temp(sp, te, ::MIR::Constant(re.first.as_Uint())); + auto cmp_lt_lval = builder.lvalue_or_temp(sp, ::HIR::CoreType::Bool, ::MIR::RValue::make_BinOp({ match_val.clone(), ::MIR::eBinOp::LT, mv$(test_lt_lval) })); + builder.end_block( ::MIR::Terminator::make_If({ mv$(cmp_lt_lval), fail_bb, test_bb_2 }) ); + + builder.set_cur_block(test_bb_2); + + // IF `match_val` > `last` : fail_bb + auto test_gt_lval = builder.lvalue_or_temp(sp, te, ::MIR::Constant(re.last.as_Uint())); + auto cmp_gt_lval = builder.lvalue_or_temp(sp, ::HIR::CoreType::Bool, ::MIR::RValue::make_BinOp({ match_val.clone(), ::MIR::eBinOp::GT, mv$(test_gt_lval) })); + builder.end_block( ::MIR::Terminator::make_If({ mv$(cmp_gt_lval), fail_bb, succ_bb }) ); + + builder.set_cur_block(succ_bb); ) ) break; |