summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/hir_expand/closures.cpp19
-rw-r--r--src/hir_expand/reborrow.cpp9
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