diff options
-rw-r--r-- | src/hir/expr.hpp | 1 | ||||
-rw-r--r-- | src/hir_expand/closures.cpp | 41 | ||||
-rw-r--r-- | src/hir_typeck/static.cpp | 7 |
3 files changed, 43 insertions, 6 deletions
diff --git a/src/hir/expr.hpp b/src/hir/expr.hpp index e1a8d77a..3e13c43d 100644 --- a/src/hir/expr.hpp +++ b/src/hir/expr.hpp @@ -797,6 +797,7 @@ struct ExprNode_Closure: Mut, Once, } m_class = Class::Unknown; + bool m_is_copy = false; // - Path to the generated closure type ::HIR::GenericPath m_obj_path_base; diff --git a/src/hir_expand/closures.cpp b/src/hir_expand/closures.cpp index 134c888f..918e30d7 100644 --- a/src/hir_expand/closures.cpp +++ b/src/hir_expand/closures.cpp @@ -769,13 +769,31 @@ namespace { fixup.visit_type(ty_mono); capture_types.push_back( ::HIR::VisEnt< ::HIR::TypeRef> { ::HIR::Publicity::new_none(), mv$(ty_mono) } ); } + + // --- --- + switch(node.m_class) + { + 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; + } + + auto str = ::HIR::Struct { + params.clone(), + ::HIR::Struct::Repr::Rust, + ::HIR::Struct::Data::make_Tuple(mv$(capture_types)) + }; + str.m_markings.is_copy = node.m_is_copy; auto closure_struct_path = m_new_type( m_new_type_suffix, - ::HIR::Struct { - params.clone(), - ::HIR::Struct::Repr::Rust, - ::HIR::Struct::Data::make_Tuple(mv$(capture_types)) - } + mv$(str) ); const auto& closure_struct_ref = m_resolve.m_crate.get_struct_by_path(sp, closure_struct_path); @@ -817,6 +835,19 @@ namespace { // TODO: Replace erased types too } + if( node.m_is_copy ) + { + auto& v = const_cast<::HIR::Crate&>(m_resolve.m_crate).m_trait_impls[m_resolve.m_crate.get_lang_item_path(sp, "copy")].get_list_for_type_mut(closure_type); + v.push_back(box$(::HIR::TraitImpl { + params.clone(), {}, closure_type.clone(), + {}, + {}, + {}, + {}, + /*source module*/::HIR::SimplePath() + })); + } + // --- // 3. Create trait impls // --- diff --git a/src/hir_typeck/static.cpp b/src/hir_typeck/static.cpp index fd2e2a76..f4fbf04d 100644 --- a/src/hir_typeck/static.cpp +++ b/src/hir_typeck/static.cpp @@ -1497,6 +1497,7 @@ bool StaticTraitResolve::type_is_copy(const Span& sp, const ::HIR::TypeRef& ty) if( TARGETVER_1_29 ) { // TODO: Auto-gerated impls + return e.node->m_is_copy; } return false; ), @@ -1592,7 +1593,11 @@ bool StaticTraitResolve::type_is_clone(const Span& sp, const ::HIR::TypeRef& ty) return true; ), (Closure, - // TODO: Auto-gerated impls + if( TARGETVER_1_29 ) + { + // TODO: Auto-gerated impls + return e.node->m_is_copy; + } return false; ), (Infer, |