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.cpp14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/mir/from_hir.cpp b/src/mir/from_hir.cpp
index e21ca993..48c0d948 100644
--- a/src/mir/from_hir.cpp
+++ b/src/mir/from_hir.cpp
@@ -355,7 +355,7 @@ namespace {
}
}
- // - For the last node, don't bother with a statement scope
+ // For the last node, specially handle.
if( node.m_yields_final )
{
auto& subnode = node.m_nodes.back();
@@ -594,14 +594,17 @@ namespace {
// 'true' branch
{
+ auto stmt_scope = m_builder.new_scope_temp(node.m_true->span());
m_builder.set_cur_block(true_branch);
this->visit_node_ptr(node.m_true);
if( m_builder.block_active() || m_builder.has_result() ) {
m_builder.push_stmt_assign( node.span(), result_val.clone(), m_builder.get_result(node.m_true->span()) );
+ m_builder.terminate_scope(node.span(), mv$(stmt_scope));
m_builder.end_split_arm(node.span(), scope, true);
m_builder.end_block( ::MIR::Terminator::make_Goto(next_block) );
}
else {
+ { auto _ = mv$(stmt_scope); }
m_builder.end_split_arm(node.span(), scope, false);
}
}
@@ -610,14 +613,17 @@ namespace {
m_builder.set_cur_block(false_branch);
if( node.m_false )
{
+ auto stmt_scope = m_builder.new_scope_temp(node.m_false->span());
this->visit_node_ptr(node.m_false);
if( m_builder.block_active() )
{
m_builder.push_stmt_assign( node.span(), result_val.clone(), m_builder.get_result(node.m_false->span()) );
+ m_builder.terminate_scope(node.span(), mv$(stmt_scope));
m_builder.end_block( ::MIR::Terminator::make_Goto(next_block) );
m_builder.end_split_arm(node.span(), scope, true);
}
else {
+ { auto _ = mv$(stmt_scope); }
m_builder.end_split_arm(node.span(), scope, false);
}
}
@@ -1798,7 +1804,11 @@ namespace {
assert( !values_set[idx] );
values_set[idx] = true;
this->visit_node_ptr(valnode);
- values.at(idx) = m_builder.lvalue_or_temp( valnode->span(), valnode->m_res_type, m_builder.get_result(valnode->span()) );
+
+ // NOTE: Have to allocate a new temporary because ordering matters
+ auto tmp = m_builder.new_temporary(valnode->m_res_type);
+ m_builder.push_stmt_assign( valnode->span(), tmp.clone(), m_builder.get_result(valnode->span()) );
+ values.at(idx) = mv$(tmp);
}
for(unsigned int i = 0; i < values.size(); i ++)
{