diff options
author | John Hodge <tpg@mutabah.net> | 2016-12-18 19:44:43 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-12-18 19:44:43 +0800 |
commit | 1854bfcb56e13a131ff76754d4a3125f7a8c2f71 (patch) | |
tree | eac461a2d0369c39dd89597eab075206aa2de842 /src/mir/from_hir.cpp | |
parent | d4d935a1f5390de5765e77d5f6c724e47213c243 (diff) | |
download | mrust-1854bfcb56e13a131ff76754d4a3125f7a8c2f71.tar.gz |
MIR Gen - Prevent returned values from being dropped
Diffstat (limited to 'src/mir/from_hir.cpp')
-rw-r--r-- | src/mir/from_hir.cpp | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/src/mir/from_hir.cpp b/src/mir/from_hir.cpp index f014961a..d30140e4 100644 --- a/src/mir/from_hir.cpp +++ b/src/mir/from_hir.cpp @@ -337,6 +337,7 @@ namespace { ::MIR::RValue res; bool diverged = false; + auto block_res = m_builder.new_temporary(node.m_res_type); auto scope = m_builder.new_scope_var(node.span()); for(unsigned int i = 0; i < node.m_nodes.size()-1; i ++) @@ -347,6 +348,7 @@ namespace { auto stmt_scope = m_builder.new_scope_temp(sp); this->visit_node_ptr(subnode); if( m_builder.has_result() ) { + // TODO: Drop. m_builder.get_result(sp); } @@ -371,8 +373,11 @@ namespace { if( m_builder.has_result() || m_builder.block_active() ) { ASSERT_BUG(sp, m_builder.block_active(), "Result yielded, but no active block"); ASSERT_BUG(sp, m_builder.has_result(), "Active block but no result yeilded"); - // PROBLEM: + // PROBLEM: This can drop the result before we want to use it. + res = m_builder.get_result(sp); + m_builder.raise_variables(sp, res); + m_builder.terminate_scope(sp, mv$(stmt_scope)); res_valid = true; } |