mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-17 01:13:11 +00:00
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:
commit
1bf0649544
@ -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)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
19
src/test/run-pass/issue-18883.rs
Normal file
19
src/test/run-pass/issue-18883.rs
Normal 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:| {};
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user