summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-11-05 14:42:53 +0800
committerJohn Hodge <tpg@mutabah.net>2016-11-05 14:42:53 +0800
commit351957a215675d1a3035971ef4af0601a8cdf47a (patch)
treee5ea340d4e78a14c4790c15648892f7c7c7cc418 /src
parentf0f1cabbc4575f56dc6e4f62f1003e743911ca00 (diff)
downloadmrust-351957a215675d1a3035971ef4af0601a8cdf47a.tar.gz
MIR Gen - Empty match statements
Diffstat (limited to 'src')
-rw-r--r--src/mir/from_hir.cpp22
-rw-r--r--src/mir/mir_builder.cpp8
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({}) );