1
Fork 0

rustc_trans: unbox closures used in function arguments

This commit is contained in:
Jorge Aparicio 2014-12-30 20:09:48 -05:00
parent 5de9f47e49
commit 24b49228f0

View file

@ -299,12 +299,16 @@ fn apply_adjustments<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
// into a type to be destructed. If we want to end up with a Box pointer, // into a type to be destructed. If we want to end up with a Box pointer,
// then mk_ty should make a Box pointer (T -> Box<T>), if we want a // then mk_ty should make a Box pointer (T -> Box<T>), if we want a
// borrowed reference then it should be T -> &T. // borrowed reference then it should be T -> &T.
// FIXME(#19596) unbox `mk_ty` fn unsized_info<'blk, 'tcx, F>(bcx: Block<'blk, 'tcx>,
fn unsized_info<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, kind: &ty::UnsizeKind<'tcx>,
kind: &ty::UnsizeKind<'tcx>, id: ast::NodeId,
id: ast::NodeId, unadjusted_ty: Ty<'tcx>,
unadjusted_ty: Ty<'tcx>, mk_ty: F) -> ValueRef where
mk_ty: |Ty<'tcx>| -> Ty<'tcx>) -> ValueRef { F: FnOnce(Ty<'tcx>) -> Ty<'tcx>,
{
// FIXME(#19596) workaround: `|t| t` causes monomorphization recursion
fn identity<T>(t: T) -> T { t }
debug!("unsized_info(kind={}, id={}, unadjusted_ty={})", debug!("unsized_info(kind={}, id={}, unadjusted_ty={})",
kind, id, unadjusted_ty.repr(bcx.tcx())); kind, id, unadjusted_ty.repr(bcx.tcx()));
match kind { match kind {
@ -314,7 +318,7 @@ fn apply_adjustments<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
let ty_substs = substs.types.get_slice(subst::TypeSpace); let ty_substs = substs.types.get_slice(subst::TypeSpace);
// The dtor for a field treats it like a value, so mk_ty // The dtor for a field treats it like a value, so mk_ty
// should just be the identity function. // should just be the identity function.
unsized_info(bcx, k, id, ty_substs[tp_index], |t| t) unsized_info(bcx, k, id, ty_substs[tp_index], identity)
} }
_ => bcx.sess().bug(format!("UnsizeStruct with bad sty: {}", _ => bcx.sess().bug(format!("UnsizeStruct with bad sty: {}",
bcx.ty_to_string(unadjusted_ty))[]) bcx.ty_to_string(unadjusted_ty))[])