summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-12-25 17:19:06 +1100
committerJohn Hodge <tpg@mutabah.net>2016-12-25 17:19:06 +1100
commit27b0292ca6828eed7e782a57ad4d641f0ebf7357 (patch)
treed453c1936058b6a4be061a3b418abe0fc80cecbb /src
parent9c7978323aaf7b1c9f9840b7665f43b59f4de282 (diff)
downloadmrust-27b0292ca6828eed7e782a57ad4d641f0ebf7357.tar.gz
MIR Gen - Misc fixes for drop order quirks
Diffstat (limited to 'src')
-rw-r--r--src/mir/from_hir.cpp6
-rw-r--r--src/mir/from_hir_match.cpp2
-rw-r--r--src/mir/mir_builder.cpp6
3 files changed, 12 insertions, 2 deletions
diff --git a/src/mir/from_hir.cpp b/src/mir/from_hir.cpp
index 272cea48..c50806f5 100644
--- a/src/mir/from_hir.cpp
+++ b/src/mir/from_hir.cpp
@@ -1804,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 ++)
{
diff --git a/src/mir/from_hir_match.cpp b/src/mir/from_hir_match.cpp
index 5b425976..5e48eab3 100644
--- a/src/mir/from_hir_match.cpp
+++ b/src/mir/from_hir_match.cpp
@@ -272,9 +272,9 @@ void MIR_LowerHIR_Match( MirBuilder& builder, MirConverter& conv, ::HIR::ExprNod
ac.destructures.push_back( builder.new_bb_unlinked() );
builder.set_cur_block( ac.destructures.back() );
conv.destructure_from( arm.m_code->span(), pat, match_val.clone(), true );
+ builder.end_split_arm( arm.m_code->span(), pat_scope, true );
builder.pause_cur_block();
// NOTE: Paused block resumed upon successful match
- builder.end_split_arm( arm.m_code->span(), pat_scope, true );
}
builder.terminate_scope( arm.m_code->span(), mv$(pat_scope) );
diff --git a/src/mir/mir_builder.cpp b/src/mir/mir_builder.cpp
index 2300a207..43a36060 100644
--- a/src/mir/mir_builder.cpp
+++ b/src/mir/mir_builder.cpp
@@ -263,6 +263,7 @@ void MirBuilder::push_stmt_drop(const Span& sp, ::MIR::LValue val)
return ;
}
+ DEBUG("DROP " << val);
m_output.blocks.at(m_current_block).statements.push_back( ::MIR::Statement::make_Drop({ ::MIR::eDropKind::DEEP, mv$(val) }) );
}
void MirBuilder::push_stmt_drop_shallow(const Span& sp, ::MIR::LValue val)
@@ -276,6 +277,7 @@ void MirBuilder::push_stmt_drop_shallow(const Span& sp, ::MIR::LValue val)
// return ;
//}
+ DEBUG("DROP shallow " << val);
m_output.blocks.at(m_current_block).statements.push_back( ::MIR::Statement::make_Drop({ ::MIR::eDropKind::SHALLOW, mv$(val) }) );
}
@@ -349,6 +351,9 @@ void MirBuilder::raise_variables(const Span& sp, const ::MIR::LValue& val)
(Field,
raise_variables(sp, *e.val);
),
+ (Downcast,
+ raise_variables(sp, *e.val);
+ ),
// Actual value types
(Variable,
auto idx = e;
@@ -824,6 +829,7 @@ void MirBuilder::complete_scope(ScopeDef& sd)
DEBUG(i << " (_,"<<new_state<<")");
m_changed[i] = true;
m_new_states[i] = new_state;
+ // TODO: Store the original state for comparison?
}
else
{