summaryrefslogtreecommitdiff
path: root/src/mir/from_hir.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mir/from_hir.cpp')
-rw-r--r--src/mir/from_hir.cpp22
1 files changed, 20 insertions, 2 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