about summary refs log tree commit diff
diff options
context:
space:
mode:
authorest31 <MTest31@outlook.com>2017-02-23 21:35:12 +0100
committerest31 <MTest31@outlook.com>2017-02-23 22:32:25 +0100
commitf753a6ef0252689930fbfdf39859bf80c0388955 (patch)
treea63bd2d51e75698d2b0c4b913c17730492cf29b6
parent1b9b32288369dbd13a9d721d6765ddc30d29e8c1 (diff)
downloadrust-f753a6ef0252689930fbfdf39859bf80c0388955.tar.gz
rust-f753a6ef0252689930fbfdf39859bf80c0388955.zip
Feature gate
-rw-r--r--src/librustc_typeck/check/coercion.rs9
-rw-r--r--src/libsyntax/feature_gate.rs7
-rw-r--r--src/test/run-pass/closure-to-fn-coercion.rs2
3 files changed, 17 insertions, 1 deletions
diff --git a/src/librustc_typeck/check/coercion.rs b/src/librustc_typeck/check/coercion.rs
index e9ac0a58d36..ab498b453dd 100644
--- a/src/librustc_typeck/check/coercion.rs
+++ b/src/librustc_typeck/check/coercion.rs
@@ -74,6 +74,7 @@ use rustc::ty::error::TypeError;
 use rustc::ty::relate::RelateResult;
 use syntax::ast::NodeId;
 use syntax::abi;
+use syntax::feature_gate;
 use util::common::indent;
 
 use std::cell::RefCell;
@@ -575,6 +576,14 @@ impl<'f, 'gcx, 'tcx> Coerce<'f, 'gcx, 'tcx> {
         let node_id_a :NodeId = self.tcx.hir.as_local_node_id(def_id_a).unwrap();
         match b.sty {
             ty::TyFnPtr(_) if self.tcx.with_freevars(node_id_a, |v| v.is_empty()) => {
+                if !self.tcx.sess.features.borrow().closure_to_fn_coercion {
+                    feature_gate::emit_feature_err(&self.tcx.sess.parse_sess,
+                                                   "closure_to_fn_coercion",
+                                                   self.cause.span,
+                                                   feature_gate::GateIssue::Language,
+                                                   feature_gate::CLOSURE_TO_FN_COERCION);
+                    return self.unify_and_identity(a, b);
+                }
                 // We coerce the closure, which has fn type
                 //     `extern "rust-call" fn((arg0,arg1,...)) -> _`
                 // to
diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs
index 1bed3e27847..2d3fd78867a 100644
--- a/src/libsyntax/feature_gate.rs
+++ b/src/libsyntax/feature_gate.rs
@@ -325,6 +325,10 @@ declare_features! (
 
     // Used to identify crates that contain sanitizer runtimes
     // rustc internal
+    (active, closure_to_fn_coercion, "1.17.0", Some(39817)),
+
+    // Used to identify crates that contain sanitizer runtimes
+    // rustc internal
     (active, sanitizer_runtime, "1.17.0", None),
 );
 
@@ -977,6 +981,9 @@ pub const EXPLAIN_DERIVE_UNDERSCORE: &'static str =
 pub const EXPLAIN_PLACEMENT_IN: &'static str =
     "placement-in expression syntax is experimental and subject to change.";
 
+pub const CLOSURE_TO_FN_COERCION: &'static str =
+    "non-capturing closure to fn coercion is experimental";
+
 struct PostExpansionVisitor<'a> {
     context: &'a Context<'a>,
 }
diff --git a/src/test/run-pass/closure-to-fn-coercion.rs b/src/test/run-pass/closure-to-fn-coercion.rs
index c4d0bbdd070..f3f0736041b 100644
--- a/src/test/run-pass/closure-to-fn-coercion.rs
+++ b/src/test/run-pass/closure-to-fn-coercion.rs
@@ -10,7 +10,7 @@
 
 // ignore-stage0: new feature, remove this when SNAP
 
-// #![feature(closure_to_fn_coercion)]
+#![feature(closure_to_fn_coercion)]
 
 const FOO :fn(u8) -> u8 = |v: u8| { v };