summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/hir/expr.hpp1
-rw-r--r--src/hir_expand/closures.cpp41
-rw-r--r--src/hir_typeck/static.cpp7
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,