Skip to content

Commit f8c892a

Browse files
committed
Make closure contents call out to trait_contents.
1 parent 108739f commit f8c892a

File tree

1 file changed

+14
-7
lines changed

1 file changed

+14
-7
lines changed

src/librustc/middle/ty.rs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2249,16 +2249,23 @@ pub fn type_contents(cx: ctxt, ty: t) -> TypeContents {
22492249
}
22502250

22512251
fn closure_contents(cty: &ClosureTy) -> TypeContents {
2252+
// Closure contents are just like trait contents, but with potentially
2253+
// even more stuff.
22522254
let st = match cty.sigil {
2253-
ast::BorrowedSigil => TC_BORROWED_POINTER,
2254-
ast::ManagedSigil => TC_MANAGED,
2255-
ast::OwnedSigil => if cty.bounds.contains_elem(BoundCopy) {
2256-
TC_OWNED_POINTER
2257-
} else {
2258-
TC_OWNED_POINTER + TC_NONCOPY_TRAIT
2259-
}
2255+
ast::BorrowedSigil =>
2256+
trait_contents(RegionTraitStore(cty.region), m_imm, cty.bounds)
2257+
+ TC_BORROWED_POINTER, // might be an env packet even if static
2258+
ast::ManagedSigil =>
2259+
trait_contents(BoxTraitStore, m_imm, cty.bounds),
2260+
ast::OwnedSigil =>
2261+
trait_contents(UniqTraitStore, m_imm, cty.bounds),
22602262
};
2263+
// FIXME(#3569): This borrowed_contents call should be taken care of in
2264+
// trait_contents, after ~Traits and @Traits can have region bounds too.
2265+
// This one here is redundant for &fns but important for ~fns and @fns.
22612266
let rt = borrowed_contents(cty.region, m_imm);
2267+
// This also prohibits "@once fn" from being copied, which allows it to
2268+
// be called. Neither way really makes much sense.
22622269
let ot = match cty.onceness {
22632270
ast::Once => TC_ONCE_CLOSURE,
22642271
ast::Many => TC_NONE

0 commit comments

Comments
 (0)