about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2017-06-18 23:22:35 +0000
committerbors <bors@rust-lang.org>2017-06-18 23:22:35 +0000
commit30322efee2fd82140dc4b05c12eeb3bf624a7ea8 (patch)
tree35f664a5d1e155bdc8d1ee45a6168d03533dc6af /src
parent10d7cb44c98f25c04dcefb6b6555237de8b8bd7e (diff)
parent09219d6a49357ae8dbfedae35fff20e6ffb6f738 (diff)
downloadrust-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.rs4
-rw-r--r--src/test/run-pass/closure-to-fn-coercion.rs7
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);
 }