diff options
author | John Hodge <tpg@ucc.asn.au> | 2019-10-11 08:10:55 +0800 |
---|---|---|
committer | John Hodge <tpg@ucc.asn.au> | 2019-10-11 08:10:55 +0800 |
commit | 878ddace93c53bf0e1505d768607c78d2b74b93c (patch) | |
tree | fd0323ac768096baf2e38ba1c73aa9656f4c772d /src/hir_expand | |
parent | a377ca4de6418247b7715c670e604a8008d548c2 (diff) | |
download | mrust-878ddace93c53bf0e1505d768607c78d2b74b93c.tar.gz |
HIR Expand Closures - Copy if all captures are Copy
Diffstat (limited to 'src/hir_expand')
-rw-r--r-- | src/hir_expand/closures.cpp | 18 |
1 files changed, 7 insertions, 11 deletions
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 { |