Feature gate
This commit is contained in:
parent
1b9b322883
commit
f753a6ef02
3 changed files with 17 additions and 1 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -323,6 +323,10 @@ declare_features! (
|
|||
// `extern "msp430-interrupt" fn()`
|
||||
(active, abi_msp430_interrupt, "1.16.0", Some(38487)),
|
||||
|
||||
// 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>,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 };
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue