summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2019-10-11 08:10:55 +0800
committerJohn Hodge <tpg@ucc.asn.au>2019-10-11 08:10:55 +0800
commit878ddace93c53bf0e1505d768607c78d2b74b93c (patch)
treefd0323ac768096baf2e38ba1c73aa9656f4c772d /src
parenta377ca4de6418247b7715c670e604a8008d548c2 (diff)
downloadmrust-878ddace93c53bf0e1505d768607c78d2b74b93c.tar.gz
HIR Expand Closures - Copy if all captures are Copy
Diffstat (limited to 'src')
-rw-r--r--src/hir_expand/closures.cpp18
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, &params, 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 {