diff options
author | John Hodge <tpg@mutabah.net> | 2016-11-05 14:42:53 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-11-05 14:42:53 +0800 |
commit | 351957a215675d1a3035971ef4af0601a8cdf47a (patch) | |
tree | e5ea340d4e78a14c4790c15648892f7c7c7cc418 /src | |
parent | f0f1cabbc4575f56dc6e4f62f1003e743911ca00 (diff) | |
download | mrust-351957a215675d1a3035971ef4af0601a8cdf47a.tar.gz |
MIR Gen - Empty match statements
Diffstat (limited to 'src')
-rw-r--r-- | src/mir/from_hir.cpp | 22 | ||||
-rw-r--r-- | src/mir/mir_builder.cpp | 8 |
2 files changed, 24 insertions, 6 deletions
diff --git a/src/mir/from_hir.cpp b/src/mir/from_hir.cpp index b8085cdb..1c3bddb4 100644 --- a/src/mir/from_hir.cpp +++ b/src/mir/from_hir.cpp @@ -306,6 +306,7 @@ namespace { { bool res_valid; ::MIR::RValue res; + bool diverged = false; auto scope = m_builder.new_scope_var(node.span()); @@ -325,6 +326,9 @@ namespace { } else { auto _ = mv$(stmt_scope); + + m_builder.set_cur_block( m_builder.new_bb_unlinked() ); + diverged = true; } } @@ -351,7 +355,13 @@ namespace { // Drop all bindings introduced during this block. if( m_builder.block_active() ) { - m_builder.terminate_scope( node.span(), mv$(scope) ); + if( diverged ) { + auto _ = mv$(scope); + m_builder.end_block( ::MIR::Terminator::make_Diverge({}) ); + } + else { + m_builder.terminate_scope( node.span(), mv$(scope) ); + } } else { auto _ = mv$(scope); @@ -389,7 +399,12 @@ namespace { { this->visit_node_ptr(node.m_value); - this->destructure_from(node.span(), node.m_pattern, m_builder.get_result_in_lvalue(node.m_value->span(), node.m_type)); + if( m_builder.block_active() ) { + this->destructure_from(node.span(), node.m_pattern, m_builder.get_result_in_lvalue(node.m_value->span(), node.m_type)); + } + else { + return ; + } } m_builder.set_result(node.span(), ::MIR::RValue::make_Tuple({})); } @@ -481,6 +496,9 @@ namespace { // TODO: Ensure that the type is a zero-variant enum or ! m_builder.end_split_arm_early(node.span()); m_builder.end_block( ::MIR::Terminator::make_Diverge({}) ); + // Push an "diverge" result + //m_builder.set_cur_block( m_builder.new_bb_unlinked() ); + //m_builder.set_result(node.span(), ::MIR::LValue::make_Invalid({}) ); } else if( node.m_arms.size() == 1 && node.m_arms[0].m_patterns.size() == 1 && ! node.m_arms[0].m_cond ) { // - Shortcut: Single-arm match diff --git a/src/mir/mir_builder.cpp b/src/mir/mir_builder.cpp index 84b8dac3..c07fdcdc 100644 --- a/src/mir/mir_builder.cpp +++ b/src/mir/mir_builder.cpp @@ -38,12 +38,12 @@ MirBuilder::~MirBuilder() { // TODO: Function span const auto& sp = m_root_span; - if( has_result() ) - { - push_stmt_assign( sp, ::MIR::LValue::make_Return({}), get_result(Span()) ); - } if( block_active() ) { + if( has_result() ) + { + push_stmt_assign( sp, ::MIR::LValue::make_Return({}), get_result(Span()) ); + } terminate_scope( sp, ScopeHandle { *this, 1 } ); terminate_scope( sp, mv$(m_fcn_scope) ); end_block( ::MIR::Terminator::make_Return({}) ); |