diff options
-rw-r--r-- | src/hir_expand/closures.cpp | 19 | ||||
-rw-r--r-- | src/hir_expand/reborrow.cpp | 9 |
2 files changed, 17 insertions, 11 deletions
diff --git a/src/hir_expand/closures.cpp b/src/hir_expand/closures.cpp index 35071825..0923e494 100644 --- a/src/hir_expand/closures.cpp +++ b/src/hir_expand/closures.cpp @@ -456,6 +456,14 @@ namespace { auto ent = mv$( m_closure_stack.back() ); m_closure_stack.pop_back(); + // - If this closure is a move closure, mutate `captured_vars` such that all captures are tagged with ValueUsage::Move + if( node.m_is_move ) + { + for(auto& cap : ent.captured_vars) + { + cap.second = ::HIR::ValueUsage::Move; + } + } // --- Apply the capture set for this closure to the parent --- if( m_closure_stack.size() > 0 ) { @@ -562,16 +570,6 @@ namespace { for(const auto& bound : m_resolve.item_generics().m_bounds ) { params.m_bounds.push_back( monomorph_bound(bound) ); } - - - // - If this closure is a move closure, mutate `captured_vars` such that all captures are tagged with ValueUsage::Move - if( node.m_is_move ) - { - for(auto& cap : ent.captured_vars) - { - cap.second = ::HIR::ValueUsage::Move; - } - } DEBUG("--- Mutate inner code"); // 2. Iterate over the nodes and rewrite variable accesses to either renumbered locals, or field accesses @@ -605,7 +603,6 @@ namespace { auto val_node = NEWNODE(cap_ty.clone(), Variable, sp, "", binding_idx); ::HIR::BorrowType bt; - // TODO: If move closure, all move. switch(binding_type) { case ::HIR::ValueUsage::Unknown: diff --git a/src/hir_expand/reborrow.cpp b/src/hir_expand/reborrow.cpp index 7e305937..8395f340 100644 --- a/src/hir_expand/reborrow.cpp +++ b/src/hir_expand/reborrow.cpp @@ -79,6 +79,8 @@ namespace { else { // Not a node that should have reborrow applied (likely generated an owned &mut) + const auto* node = node_ptr.get(); + DEBUG("Node " << node << " " << typeid(*node).name() << " cannot have a reborrow"); } } ) @@ -86,6 +88,7 @@ namespace { } void visit(::HIR::ExprNode_Assign& node) override { + ::HIR::ExprVisitorDef::visit(node); node.m_value = do_reborrow(mv$(node.m_value)); } void visit(::HIR::ExprNode_CallPath& node) override { @@ -135,6 +138,12 @@ namespace { ::HIR::ExprVisitorDef::visit(node); node.m_value = do_reborrow(mv$(node.m_value)); } + void visit(::HIR::ExprNode_Closure& node) override { + ::HIR::ExprVisitorDef::visit(node); + for(auto& arg : node.m_captures) { + arg = do_reborrow(mv$(arg)); + } + } }; class OuterVisitor: public ::HIR::Visitor |