Control usage of ! through a feature gate.

Adds the `bang_type` feature gate. `!` in a non-return-type position now
relies on that feature.
This commit is contained in:
Andrew Cann 2016-08-01 20:15:54 +08:00
parent 0e1c2aa52e
commit 5096a8c5c0
4 changed files with 26 additions and 3 deletions

View File

@ -87,6 +87,7 @@
#![feature(staged_api)]
#![feature(unboxed_closures)]
#![feature(question_mark)]
#![cfg_attr(not(stage0), feature(bang_type))]
#[macro_use]
mod macros;

View File

@ -284,7 +284,10 @@ declare_features! (
// Allows tuple structs and variants in more contexts,
// Permits numeric fields in struct expressions and patterns.
(active, relaxed_adts, "1.12.0", Some(35626))
(active, relaxed_adts, "1.12.0", Some(35626)),
// The `!` type
(active, bang_type, "1.13.0", Some(35121))
);
declare_features! (
@ -963,11 +966,25 @@ impl<'a> Visitor for PostExpansionVisitor<'a> {
gate_feature_post!(&self, conservative_impl_trait, ty.span,
"`impl Trait` is experimental");
}
ast::TyKind::Empty => {
gate_feature_post!(&self, bang_type, ty.span,
"The `!` type is experimental");
},
_ => {}
}
visit::walk_ty(self, ty)
}
fn visit_fn_ret_ty(&mut self, ret_ty: &ast::FunctionRetTy) {
if let ast::FunctionRetTy::Ty(ref output_ty) = *ret_ty {
match output_ty.node {
ast::TyKind::Empty => return,
_ => (),
};
visit::walk_ty(self, output_ty)
}
}
fn visit_expr(&mut self, e: &ast::Expr) {
match e.node {
ast::ExprKind::Box(_) => {

View File

@ -4,7 +4,8 @@
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your,
// "The `!` type is experimental");
// option. This file may not be copied, modified, or distributed
// except according to those terms.
@ -128,6 +129,9 @@ pub trait Visitor: Sized {
fn visit_vis(&mut self, vis: &Visibility) {
walk_vis(self, vis)
}
fn visit_fn_ret_ty(&mut self, ret_ty: &FunctionRetTy) {
walk_fn_ret_ty(self, ret_ty)
}
}
#[macro_export]
@ -510,7 +514,7 @@ pub fn walk_fn_decl<V: Visitor>(visitor: &mut V, function_declaration: &FnDecl)
visitor.visit_pat(&argument.pat);
visitor.visit_ty(&argument.ty)
}
walk_fn_ret_ty(visitor, &function_declaration.output)
visitor.visit_fn_ret_ty(&function_declaration.output)
}
pub fn walk_fn_kind<V: Visitor>(visitor: &mut V, function_kind: FnKind) {

View File

@ -8,6 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![feature(bang_type)]