diff options
author | John Hodge <tpg@mutabah.net> | 2016-12-25 17:19:06 +1100 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-12-25 17:19:06 +1100 |
commit | 27b0292ca6828eed7e782a57ad4d641f0ebf7357 (patch) | |
tree | d453c1936058b6a4be061a3b418abe0fc80cecbb /src | |
parent | 9c7978323aaf7b1c9f9840b7665f43b59f4de282 (diff) | |
download | mrust-27b0292ca6828eed7e782a57ad4d641f0ebf7357.tar.gz |
MIR Gen - Misc fixes for drop order quirks
Diffstat (limited to 'src')
-rw-r--r-- | src/mir/from_hir.cpp | 6 | ||||
-rw-r--r-- | src/mir/from_hir_match.cpp | 2 | ||||
-rw-r--r-- | src/mir/mir_builder.cpp | 6 |
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 { |