From f096c8d17412b6303dc80cfff3dee5c2dffd16e5 Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Mon, 8 May 2017 14:56:33 -0500 Subject: [PATCH 1/5] inferring expected types of closure arguments when coercing to a fn --- src/librustc_typeck/check/closure.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/librustc_typeck/check/closure.rs b/src/librustc_typeck/check/closure.rs index 45b0a571bd08a..fb3be84931992 100644 --- a/src/librustc_typeck/check/closure.rs +++ b/src/librustc_typeck/check/closure.rs @@ -126,6 +126,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> { (sig, kind) } ty::TyInfer(ty::TyVar(vid)) => self.deduce_expectations_from_obligations(vid), + ty::TyFnPtr(sig) => (Some(sig.skip_binder().clone()), Some(ty::ClosureKind::Fn)), _ => (None, None), } } From 170c4340f66bd9843a2bfc2ccfa305cddbeb4807 Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Mon, 8 May 2017 16:04:49 -0500 Subject: [PATCH 2/5] dividied closure-no-fn.rs into three different tests --- .../{closure-no-fn.rs => closure-no-fn-1.rs} | 6 ------ src/test/compile-fail/closure-no-fn-2.rs | 18 ++++++++++++++++++ src/test/compile-fail/closure-no-fn-3.rs | 18 ++++++++++++++++++ 3 files changed, 36 insertions(+), 6 deletions(-) rename src/test/compile-fail/{closure-no-fn.rs => closure-no-fn-1.rs} (77%) create mode 100644 src/test/compile-fail/closure-no-fn-2.rs create mode 100644 src/test/compile-fail/closure-no-fn-3.rs diff --git a/src/test/compile-fail/closure-no-fn.rs b/src/test/compile-fail/closure-no-fn-1.rs similarity index 77% rename from src/test/compile-fail/closure-no-fn.rs rename to src/test/compile-fail/closure-no-fn-1.rs index fe179e8a48f16..10c99703a97ff 100644 --- a/src/test/compile-fail/closure-no-fn.rs +++ b/src/test/compile-fail/closure-no-fn-1.rs @@ -15,10 +15,4 @@ fn main() { let mut a = 0u8; let foo: fn(u8) -> u8 = |v: u8| { a += v; a }; //~^ ERROR mismatched types - let b = 0u8; - let bar: fn() -> u8 = || { b }; - //~^ ERROR mismatched types - let baz: fn() -> u8 = || { b } as fn() -> u8; - //~^ ERROR mismatched types - //~^^ ERROR non-scalar cast } diff --git a/src/test/compile-fail/closure-no-fn-2.rs b/src/test/compile-fail/closure-no-fn-2.rs new file mode 100644 index 0000000000000..a6438bb5f2418 --- /dev/null +++ b/src/test/compile-fail/closure-no-fn-2.rs @@ -0,0 +1,18 @@ +// Copyright 2017 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Ensure that capturing closures are never coerced to fns +// Especially interesting as non-capturing closures can be. + +fn main() { + let b = 0u8; + let bar: fn() -> u8 = || { b }; + //~^ ERROR mismatched types +} diff --git a/src/test/compile-fail/closure-no-fn-3.rs b/src/test/compile-fail/closure-no-fn-3.rs new file mode 100644 index 0000000000000..85dbc899208f6 --- /dev/null +++ b/src/test/compile-fail/closure-no-fn-3.rs @@ -0,0 +1,18 @@ +// Copyright 2017 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Ensure that capturing closures are never coerced to fns +// Especially interesting as non-capturing closures can be. + +fn main() { + let b = 0u8; + let baz: fn() -> u8 = (|| { b }) as fn() -> u8; + //~^ ERROR non-scalar cast +} From 8aaae945eaf929cc277cfb5705e8d6d280e2a102 Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Mon, 8 May 2017 16:17:26 -0500 Subject: [PATCH 3/5] first part of issue-40000.rs is now passing --- src/test/compile-fail/issue-40000.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/compile-fail/issue-40000.rs b/src/test/compile-fail/issue-40000.rs index 9be114ebcb6e0..3ccee0f12becb 100644 --- a/src/test/compile-fail/issue-40000.rs +++ b/src/test/compile-fail/issue-40000.rs @@ -11,8 +11,7 @@ #![feature(closure_to_fn_coercion)] fn main() { - let bar: fn(&mut u32) = |_| {}; //~ ERROR mismatched types - //~| expected concrete lifetime, found bound lifetime parameter + let bar: fn(&mut u32) = |_| {}; fn foo(x: Box) {} let bar = Box::new(|x: &i32| {}) as Box; From 78b27373dced7ec5bb1243982271cda9f1079693 Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Mon, 8 May 2017 16:34:29 -0500 Subject: [PATCH 4/5] added test --- .../closure_to_fn_coercion-expected-types.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/test/run-pass/closure_to_fn_coercion-expected-types.rs diff --git a/src/test/run-pass/closure_to_fn_coercion-expected-types.rs b/src/test/run-pass/closure_to_fn_coercion-expected-types.rs new file mode 100644 index 0000000000000..7d951c655ca3b --- /dev/null +++ b/src/test/run-pass/closure_to_fn_coercion-expected-types.rs @@ -0,0 +1,18 @@ +// Copyright 2012 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. +// +// Ensure that we deduce expected argument types when a `fn()` type is expected (#41755) + +#![feature(closure_to_fn_coercion)] +fn foo(f: fn(Vec) -> usize) { } + +fn main() { + foo(|x| x.len()) +} From 82e07363916146f0d6e01199ef30544e7fdd6248 Mon Sep 17 00:00:00 2001 From: Christian Poveda Date: Mon, 8 May 2017 16:39:47 -0500 Subject: [PATCH 5/5] massive refactor --- src/test/run-pass/closure_to_fn_coercion-expected-types.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/run-pass/closure_to_fn_coercion-expected-types.rs b/src/test/run-pass/closure_to_fn_coercion-expected-types.rs index 7d951c655ca3b..7214ebfaf0703 100644 --- a/src/test/run-pass/closure_to_fn_coercion-expected-types.rs +++ b/src/test/run-pass/closure_to_fn_coercion-expected-types.rs @@ -7,7 +7,6 @@ // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. -// // Ensure that we deduce expected argument types when a `fn()` type is expected (#41755) #![feature(closure_to_fn_coercion)]