summaryrefslogtreecommitdiff
path: root/src/mir/from_hir.cpp
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2017-03-18 15:29:32 +0800
committerJohn Hodge <tpg@ucc.asn.au>2017-03-18 15:29:32 +0800
commit3aaee59ee3ceab85e88e046336b2fcc72817e89f (patch)
tree65cd650bde3cd7f70219fdf00349804f00382a0b /src/mir/from_hir.cpp
parentaa50d1f30eac5dd9264e99c9588b2ca3871a9de0 (diff)
downloadmrust-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.cpp20
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