Skip to content

Commit c0f826f

Browse files
philbertydkm
authored andcommitted
Add capture tracking to the type info for closures
1 parent bed3d08 commit c0f826f

File tree

3 files changed

+14
-6
lines changed

3 files changed

+14
-6
lines changed

gcc/rust/typecheck/rust-hir-type-check-expr.cc

+3-1
Original file line numberDiff line numberDiff line change
@@ -1492,8 +1492,10 @@ TypeCheckExpr::visit (HIR::ClosureExpr &expr)
14921492
expr.get_locus ());
14931493

14941494
// generate the closure type
1495+
NodeId closure_node_id = expr.get_mappings ().get_nodeid ();
1496+
const std::set<NodeId> &captures = resolver->get_captures (closure_node_id);
14951497
infered = new TyTy::ClosureType (ref, id, ident, closure_args, result_type,
1496-
subst_refs);
1498+
subst_refs, captures);
14971499

14981500
// FIXME
14991501
// all closures automatically inherit the appropriate fn trait. Lets just

gcc/rust/typecheck/rust-tyty.cc

+2-3
Original file line numberDiff line numberDiff line change
@@ -1675,8 +1675,7 @@ std::string
16751675
ClosureType::as_string () const
16761676
{
16771677
std::string params_buf = parameters->as_string ();
1678-
return "|" + params_buf + "| {" + result_type.get_tyty ()->as_string ()
1679-
+ "} {" + raw_bounds_as_string () + "}";
1678+
return "|" + params_buf + "| {" + result_type.get_tyty ()->as_string () + "}";
16801679
}
16811680

16821681
BaseType *
@@ -1714,7 +1713,7 @@ ClosureType::clone () const
17141713
{
17151714
return new ClosureType (get_ref (), get_ty_ref (), ident, id,
17161715
(TyTy::TupleType *) parameters->clone (), result_type,
1717-
clone_substs (), get_combined_refs (),
1716+
clone_substs (), captures, get_combined_refs (),
17181717
specified_bounds);
17191718
}
17201719

gcc/rust/typecheck/rust-tyty.h

+9-2
Original file line numberDiff line numberDiff line change
@@ -1628,13 +1628,15 @@ class ClosureType : public BaseType, public SubstitutionRef
16281628
ClosureType (HirId ref, DefId id, RustIdent ident,
16291629
TyTy::TupleType *parameters, TyVar result_type,
16301630
std::vector<SubstitutionParamMapping> subst_refs,
1631+
std::set<NodeId> captures,
16311632
std::set<HirId> refs = std::set<HirId> (),
16321633
std::vector<TypeBoundPredicate> specified_bounds
16331634
= std::vector<TypeBoundPredicate> ())
16341635
: BaseType (ref, ref, TypeKind::CLOSURE, ident, refs),
16351636
SubstitutionRef (std::move (subst_refs),
16361637
SubstitutionArgumentMappings::error ()),
1637-
parameters (parameters), result_type (std::move (result_type)), id (id)
1638+
parameters (parameters), result_type (std::move (result_type)), id (id),
1639+
captures (captures)
16381640
{
16391641
LocalDefId local_def_id = id.localDefId;
16401642
rust_assert (local_def_id != UNKNOWN_LOCAL_DEFID);
@@ -1644,13 +1646,15 @@ class ClosureType : public BaseType, public SubstitutionRef
16441646
ClosureType (HirId ref, HirId ty_ref, RustIdent ident, DefId id,
16451647
TyTy::TupleType *parameters, TyVar result_type,
16461648
std::vector<SubstitutionParamMapping> subst_refs,
1649+
std::set<NodeId> captures,
16471650
std::set<HirId> refs = std::set<HirId> (),
16481651
std::vector<TypeBoundPredicate> specified_bounds
16491652
= std::vector<TypeBoundPredicate> ())
16501653
: BaseType (ref, ty_ref, TypeKind::CLOSURE, ident, refs),
16511654
SubstitutionRef (std::move (subst_refs),
16521655
SubstitutionArgumentMappings::error ()),
1653-
parameters (parameters), result_type (std::move (result_type)), id (id)
1656+
parameters (parameters), result_type (std::move (result_type)), id (id),
1657+
captures (captures)
16541658
{
16551659
LocalDefId local_def_id = id.localDefId;
16561660
rust_assert (local_def_id != UNKNOWN_LOCAL_DEFID);
@@ -1699,10 +1703,13 @@ class ClosureType : public BaseType, public SubstitutionRef
16991703

17001704
void setup_fn_once_output () const;
17011705

1706+
const std::set<NodeId> &get_captures () const { return captures; }
1707+
17021708
private:
17031709
TyTy::TupleType *parameters;
17041710
TyVar result_type;
17051711
DefId id;
1712+
std::set<NodeId> captures;
17061713
};
17071714

17081715
class ArrayType : public BaseType

0 commit comments

Comments
 (0)