]> git.lizzy.rs Git - rust.git/commitdiff
Control usage of `!` through a feature gate.
authorAndrew Cann <shum@canndrew.org>
Mon, 1 Aug 2016 12:15:54 +0000 (20:15 +0800)
committerAndrew Cann <shum@canndrew.org>
Sat, 13 Aug 2016 13:37:09 +0000 (21:37 +0800)
Adds the `bang_type` feature gate. `!` in a non-return-type position now
relies on that feature.

src/libcore/lib.rs
src/libsyntax/feature_gate.rs
src/libsyntax/visit.rs
src/test/run-fail/adjust_empty.rs

index fabb3900ec6483be59ef239c86eed6202c15d68b..74ef378f23d90f0a69af5a79b6dd682f33eaeaa2 100644 (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;
index ad52184a6dcb0cd658cb607b31fc5a97352ad3b6..efedc7229e64c951e3536bd2b36cec1a7d207449 100644 (file)
@@ -284,7 +284,10 @@ pub fn new() -> 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 @@ fn visit_ty(&mut self, ty: &ast::Ty) {
                 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(_) => {
index 1d40e3e395e2948fc73ef3489b2a6e214aec690d..228409b82074449a60c51e974be52beb44182317 100644 (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 @@ fn visit_macro_def(&mut self, macro_def: &MacroDef) {
     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) {
index 207c159b4ef51f8629cada00ae39f12f37b3bd65..6d81099cedaa814360dea0f4edef7defc37c3bb5 100644 (file)
@@ -8,6 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+#![feature(bang_type)]