diff options
author | John Hodge <tpg@mutabah.net> | 2016-08-11 14:36:36 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-08-11 14:36:36 +0800 |
commit | 882fa1da5af17a277075064f1dcb7974b1d182ab (patch) | |
tree | 9609b4f2000196291a3c3feea7882b93035226b3 /src | |
parent | 5af8f9e7656811f820a77c991ebef8618a99bae4 (diff) | |
download | mrust-882fa1da5af17a277075064f1dcb7974b1d182ab.tar.gz |
MIR - Match handle multi-pattern arms
Diffstat (limited to 'src')
-rw-r--r-- | src/mir/from_hir.cpp | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/src/mir/from_hir.cpp b/src/mir/from_hir.cpp index 6123c834..47f4fae4 100644 --- a/src/mir/from_hir.cpp +++ b/src/mir/from_hir.cpp @@ -864,15 +864,17 @@ namespace { }; // Map of arm index to ruleset - ::std::vector< ::std::pair< unsigned int, PatternRuleset > > arm_rules; - for(unsigned int idx = 0; idx < node.m_arms.size(); idx ++) + ::std::vector< ::std::pair< ::std::pair<unsigned int,unsigned int>, PatternRuleset > > arm_rules; + for(unsigned int arm_idx = 0; arm_idx < node.m_arms.size(); arm_idx ++) { - const auto& arm = node.m_arms[idx]; + const auto& arm = node.m_arms[arm_idx]; + unsigned int pat_idx = 0; for( const auto& pat : arm.m_patterns ) { auto builder = PatternRulesetBuilder {}; builder.append_from(node.span(), pat, node.m_value->m_res_type); - arm_rules.push_back( ::std::make_pair(idx, builder.into_ruleset()) ); + arm_rules.push_back( ::std::make_pair( ::std::make_pair(arm_idx, pat_idx), builder.into_ruleset()) ); + pat_idx += 1; } if( arm.m_cond ) { @@ -928,14 +930,13 @@ namespace { rule_blocks.push_back( m_builder.new_bb_unlinked() ); m_builder.set_cur_block(arm_blocks.back()); - const auto& arm = node.m_arms[ rule.first ]; - ASSERT_BUG(node.span(), arm.m_patterns.size() == 1, "TODO: Handle multiple patterns on one arm"); - const auto& pat = arm.m_patterns[0 /*rule.first.second*/]; + const auto& arm = node.m_arms[ rule.first.first ]; + const auto& pat = arm.m_patterns[rule.first.second]; // Assign bindings (drop registration happens in previous loop) - Allow refutable patterns this->destructure_from( arm.m_code->span(), pat, match_val.clone(), 1 ); - m_builder.end_block( ::MIR::Terminator::make_Goto( arm_blocks[rule.first] ) ); + m_builder.end_block( ::MIR::Terminator::make_Goto( arm_blocks[rule.first.first] ) ); } @@ -944,7 +945,8 @@ namespace { DecisionTreeNode root_node; for( const auto& arm_rule : arm_rules ) { - root_node.populate_tree_from_rule( node.m_arms[arm_rule.first].m_code->span(), arm_rule.first, arm_rule.second.m_rules.data(), arm_rule.second.m_rules.size() ); + auto arm_idx = arm_rule.first.first; + root_node.populate_tree_from_rule( node.m_arms[arm_idx].m_code->span(), arm_idx, arm_rule.second.m_rules.data(), arm_rule.second.m_rules.size() ); } DEBUG("root_node = " << root_node); root_node.simplify(); @@ -1294,10 +1296,10 @@ namespace { break; case ::HIR::ExprNode_BinOp::Op::BoolAnd: - TODO(node.span(), "&&"); + TODO(node.span(), "BinOp &&"); break; case ::HIR::ExprNode_BinOp::Op::BoolOr: - TODO(node.span(), "||"); + TODO(node.span(), "BinOp ||"); break; case ::HIR::ExprNode_BinOp::Op::Add: op = ::MIR::eBinOp::ADD; if(0) |