diff options
| author | bors <bors@rust-lang.org> | 2017-06-18 23:22:35 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2017-06-18 23:22:35 +0000 |
| commit | 30322efee2fd82140dc4b05c12eeb3bf624a7ea8 (patch) | |
| tree | 35f664a5d1e155bdc8d1ee45a6168d03533dc6af /src | |
| parent | 10d7cb44c98f25c04dcefb6b6555237de8b8bd7e (diff) | |
| parent | 09219d6a49357ae8dbfedae35fff20e6ffb6f738 (diff) | |
| download | rust-30322efee2fd82140dc4b05c12eeb3bf624a7ea8.tar.gz rust-30322efee2fd82140dc4b05c12eeb3bf624a7ea8.zip | |
Auto merge of #42735 - arielb1:generic-closure-fn, r=eddyb
collector: apply param substs to closures cast to fn items Fixes #42718. r? @eddyb beta-nominating because serious ICE in newly-stabilized feature.
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc_trans/collector.rs | 4 | ||||
| -rw-r--r-- | src/test/run-pass/closure-to-fn-coercion.rs | 7 |
2 files changed, 11 insertions, 0 deletions
diff --git a/src/librustc_trans/collector.rs b/src/librustc_trans/collector.rs index da74ed88eaf..d723cf32571 100644 --- a/src/librustc_trans/collector.rs +++ b/src/librustc_trans/collector.rs @@ -493,6 +493,8 @@ impl<'a, 'tcx> MirVisitor<'tcx> for MirNeighborCollector<'a, 'tcx> { } mir::Rvalue::Cast(mir::CastKind::ClosureFnPointer, ref operand, _) => { let source_ty = operand.ty(self.mir, self.scx.tcx()); + let source_ty = self.scx.tcx().trans_apply_param_substs(self.param_substs, + &source_ty); match source_ty.sty { ty::TyClosure(def_id, substs) => { let instance = monomorphize::resolve_closure( @@ -543,6 +545,8 @@ impl<'a, 'tcx> MirVisitor<'tcx> for MirNeighborCollector<'a, 'tcx> { block: mir::BasicBlock, kind: &mir::TerminatorKind<'tcx>, location: Location) { + debug!("visiting terminator {:?} @ {:?}", kind, location); + let tcx = self.scx.tcx(); match *kind { mir::TerminatorKind::Call { ref func, .. } => { diff --git a/src/test/run-pass/closure-to-fn-coercion.rs b/src/test/run-pass/closure-to-fn-coercion.rs index 7fb26bdc936..343209143cc 100644 --- a/src/test/run-pass/closure-to-fn-coercion.rs +++ b/src/test/run-pass/closure-to-fn-coercion.rs @@ -8,6 +8,8 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +use std::mem; + const FOO: fn(u8) -> u8 = |v: u8| { v }; const BAR: [fn(&mut u32); 5] = [ @@ -21,6 +23,10 @@ fn func_specific() -> (fn() -> u32) { || return 42 } +fn generic<T>(_: T) -> fn() -> usize { + || mem::size_of::<T>() +} + fn main() { // Items assert_eq!(func_specific()(), 42); @@ -34,4 +40,5 @@ fn main() { assert_eq!({ BAR[2](&mut a); a }, 3); assert_eq!({ BAR[3](&mut a); a }, 6); assert_eq!({ BAR[4](&mut a); a }, 10); + assert_eq!(generic(0i8)(), 1); } |
