auto merge of #18893 : bkoropoff/rust/issue-18883, r=alexcrichton

This was a simple case of substitutions being applied inconsistently.  I haven't investigated why type parameters are actually showing up in the closure type here, but trans needs to handle them correctly in any case.
This commit is contained in:
bors 2014-11-14 15:22:28 +00:00
commit 1bf0649544
3 changed files with 27 additions and 7 deletions

View File

@ -253,12 +253,14 @@ pub fn trans_unboxing_shim(bcx: Block,
llshimmedfn: ValueRef, llshimmedfn: ValueRef,
fty: &ty::BareFnTy, fty: &ty::BareFnTy,
method_id: ast::DefId, method_id: ast::DefId,
substs: subst::Substs) substs: &subst::Substs)
-> ValueRef { -> ValueRef {
let _icx = push_ctxt("trans_unboxing_shim"); let _icx = push_ctxt("trans_unboxing_shim");
let ccx = bcx.ccx(); let ccx = bcx.ccx();
let tcx = bcx.tcx(); let tcx = bcx.tcx();
let fty = fty.subst(tcx, substs);
// Transform the self type to `Box<self_type>`. // Transform the self type to `Box<self_type>`.
let self_type = fty.sig.inputs[0]; let self_type = fty.sig.inputs[0];
let boxed_self_type = ty::mk_uniq(tcx, self_type); let boxed_self_type = ty::mk_uniq(tcx, self_type);
@ -279,8 +281,7 @@ pub fn trans_unboxing_shim(bcx: Block,
abi: fty.abi, abi: fty.abi,
sig: boxed_function_type, sig: boxed_function_type,
}; };
let boxed_function_type = let boxed_function_type = ty::mk_bare_fn(tcx, boxed_function_type);
ty::mk_bare_fn(tcx, boxed_function_type).subst(tcx, &substs);
let function_type = match fty.abi { let function_type = match fty.abi {
synabi::RustCall => { synabi::RustCall => {
// We're passing through to a RustCall ABI function, but // We're passing through to a RustCall ABI function, but
@ -301,10 +302,10 @@ pub fn trans_unboxing_shim(bcx: Block,
abi: synabi::Rust, abi: synabi::Rust,
sig: fake_ty, sig: fake_ty,
}; };
ty::mk_bare_fn(tcx, fake_ty).subst(tcx, &substs) ty::mk_bare_fn(tcx, fake_ty)
} }
_ => { _ => {
ty::mk_bare_fn(tcx, (*fty).clone()).subst(tcx, &substs) ty::mk_bare_fn(tcx, fty)
} }
}; };

View File

@ -624,7 +624,7 @@ pub fn get_vtable(bcx: Block,
llfn, llfn,
&closure_type, &closure_type,
closure_def_id, closure_def_id,
substs); &substs);
} }
} }
@ -723,7 +723,7 @@ fn emit_vtable_methods(bcx: Block,
fn_ref, fn_ref,
&m.fty, &m.fty,
m_id, m_id,
substs.clone()); &substs);
} }
Some(fn_ref).into_iter() Some(fn_ref).into_iter()
} }

View File

@ -0,0 +1,19 @@
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// Test that we don't ICE due to encountering unsubstituted type
// parameters when untupling FnOnce parameters during translation of
// an unboxing shim.
#![feature(unboxed_closures)]
fn main() {
let _: Box<FnOnce<(),()>> = box move |&mut:| {};
}