diff options
author | John Hodge <tpg@ucc.asn.au> | 2017-03-18 15:29:32 +0800 |
---|---|---|
committer | John Hodge <tpg@ucc.asn.au> | 2017-03-18 15:29:32 +0800 |
commit | 3aaee59ee3ceab85e88e046336b2fcc72817e89f (patch) | |
tree | 65cd650bde3cd7f70219fdf00349804f00382a0b /src/mir/from_hir.cpp | |
parent | aa50d1f30eac5dd9264e99c9588b2ca3871a9de0 (diff) | |
download | mrust-3aaee59ee3ceab85e88e046336b2fcc72817e89f.tar.gz |
MIR Gen - Fix scoping of values in let bindings
Diffstat (limited to 'src/mir/from_hir.cpp')
-rw-r--r-- | src/mir/from_hir.cpp | 20 |
1 files changed, 8 insertions, 12 deletions
diff --git a/src/mir/from_hir.cpp b/src/mir/from_hir.cpp index fe876686..a15ea8ef 100644 --- a/src/mir/from_hir.cpp +++ b/src/mir/from_hir.cpp @@ -530,16 +530,6 @@ namespace { } auto res = m_builder.get_result(node.span()); - // NOTE: `let foo = &bar();` is valid! - // - So is `let (ref foo, _) = (bar(), 1);` - // - Raising the variables if there's a borrow works for most - // cases, but not cases where the let causes an unsizing. - if( res.is_Borrow() ) - { - assert(m_block_tmp_scope); - m_builder.raise_variables(node.span(), res, *m_block_tmp_scope); - } - if( node.m_pattern.m_binding.is_valid() && node.m_pattern.m_data.is_Any() && node.m_pattern.m_binding.m_type == ::HIR::PatternBinding::Type::Move ) { m_builder.push_stmt_assign( node.span(), ::MIR::LValue::make_Variable(node.m_pattern.m_binding.m_slot), mv$(res) ); @@ -663,7 +653,7 @@ namespace { if( m_builder.block_active() ) { auto res = m_builder.get_result(arm.m_code->span()); - m_builder.raise_variables( arm.m_code->span(), res, scope ); + m_builder.raise_variables( arm.m_code->span(), res, scope, /*to_above=*/true); m_builder.set_result(arm.m_code->span(), mv$(res)); m_builder.terminate_scope( node.span(), mv$(tmp_scope) ); @@ -682,7 +672,7 @@ namespace { const auto& sp = node.span(); auto res = m_builder.get_result(sp); - m_builder.raise_variables(sp, res, stmt_scope); + m_builder.raise_variables(sp, res, stmt_scope, /*to_above=*/true); m_builder.set_result(sp, mv$(res)); m_builder.terminate_scope( node.span(), mv$(stmt_scope) ); @@ -1499,6 +1489,7 @@ namespace { // TODO: Proper panic handling, including scope destruction m_builder.set_cur_block(place__panic); + //m_builder.terminate_scope_early( node.span(), m_builder.fcn_scope() ); // TODO: Drop `place` m_builder.end_block( ::MIR::Terminator::make_Diverge({}) ); m_builder.set_cur_block(place__ok); @@ -1523,6 +1514,7 @@ namespace { // TODO: Proper panic handling, including scope destruction m_builder.set_cur_block(place_raw__panic); + //m_builder.terminate_scope_early( node.span(), m_builder.fcn_scope() ); // TODO: Drop `place` m_builder.end_block( ::MIR::Terminator::make_Diverge({}) ); m_builder.set_cur_block(place_raw__ok); @@ -1559,11 +1551,13 @@ namespace { // TODO: Proper panic handling, including scope destruction m_builder.set_cur_block(res__panic); + //m_builder.terminate_scope_early( node.span(), m_builder.fcn_scope() ); // TODO: Should this drop the value written to the rawptr? // - No, becuase it's likely invalid now. Goodbye! m_builder.end_block( ::MIR::Terminator::make_Diverge({}) ); m_builder.set_cur_block(res__ok); + m_builder.mark_value_assigned(node.span(), res); m_builder.set_result( node.span(), mv$(res) ); } @@ -1735,6 +1729,8 @@ namespace { m_builder.end_block( ::MIR::Terminator::make_Diverge({}) ); m_builder.set_cur_block( next_block ); + // TODO: Support diverging value calls + m_builder.mark_value_assigned(node.span(), res); m_builder.set_result( node.span(), mv$(res) ); } void visit(::HIR::ExprNode_CallMethod& node) override |