From 878ddace93c53bf0e1505d768607c78d2b74b93c Mon Sep 17 00:00:00 2001 From: John Hodge Date: Fri, 11 Oct 2019 08:10:55 +0800 Subject: HIR Expand Closures - Copy if all captures are Copy --- src/hir_expand/closures.cpp | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/hir_expand/closures.cpp b/src/hir_expand/closures.cpp index f36f6c30..4a829cb9 100644 --- a/src/hir_expand/closures.cpp +++ b/src/hir_expand/closures.cpp @@ -731,6 +731,7 @@ namespace { ::std::vector< ::HIR::ExprNodeP> capture_nodes; capture_types.reserve( ent.captured_vars.size() ); capture_nodes.reserve( ent.captured_vars.size() ); + node.m_is_copy = true; for(const auto binding : ent.captured_vars) { const auto binding_idx = binding.first; @@ -767,22 +768,17 @@ namespace { // - Fix type to replace closure types with known paths ExprVisitor_Fixup fixup { m_resolve.m_crate, ¶ms, monomorph_cb }; fixup.visit_type(ty_mono); + if( !m_resolve.type_is_copy(sp, ty_mono) ) + { + node.m_is_copy = false; + } capture_types.push_back( ::HIR::VisEnt< ::HIR::TypeRef> { ::HIR::Publicity::new_none(), mv$(ty_mono) } ); } // --- --- - switch(node.m_class) + if( node.m_is_copy ) { - case ::HIR::ExprNode_Closure::Class::Unknown: - case ::HIR::ExprNode_Closure::Class::NoCapture: - case ::HIR::ExprNode_Closure::Class::Shared: - node.m_is_copy = true; - break; - case ::HIR::ExprNode_Closure::Class::Mut: - break; - case ::HIR::ExprNode_Closure::Class::Once: - // TODO: Check if captures are Copy? - break; + DEBUG("Copy closure"); } auto str = ::HIR::Struct { -- cgit v1.2.3