summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorAndrew Cann <shum@canndrew.org>2016-08-01 20:15:54 +0800
committerAndrew Cann <shum@canndrew.org>2016-08-13 21:37:09 +0800
commit5096a8c5c01f8d1d7edece23bab6898bd3016f2c (patch)
tree9136eb8a711502600646930721460a69bc982e4a /src/libsyntax
parent0e1c2aa52e7ec3f162ab4436c2ed0746d1992109 (diff)
downloadrust-5096a8c5c01f8d1d7edece23bab6898bd3016f2c.tar.gz
rust-5096a8c5c01f8d1d7edece23bab6898bd3016f2c.zip
Control usage of `!` through a feature gate.
Adds the `bang_type` feature gate. `!` in a non-return-type position now
relies on that feature.
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/feature_gate.rs19
-rw-r--r--src/libsyntax/visit.rs8
2 files changed, 24 insertions, 3 deletions
diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs
index ad52184a6dc..efedc7229e6 100644
--- a/src/libsyntax/feature_gate.rs
+++ b/src/libsyntax/feature_gate.rs
@@ -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(_) => {
diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs
index 1d40e3e395e..228409b8207 100644
--- a/src/libsyntax/visit.rs
+++ b/src/libsyntax/visit.rs
@@ -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) {