diff options
| author | Léo Testard <leo.testard@gmail.com> | 2013-10-21 11:16:58 +0200 |
|---|---|---|
| committer | Léo Testard <leo.testard@gmail.com> | 2013-10-21 14:04:29 +0200 |
| commit | c5346fea38ed391c7ea83b3d03354904f0f3bd39 (patch) | |
| tree | 00946f20e835e58b9c42ecc5fc91b7f956ab58e7 | |
| parent | 424c171da5e9881f3d5588f22c3794b53b2695e1 (diff) | |
| download | rust-c5346fea38ed391c7ea83b3d03354904f0f3bd39.tar.gz rust-c5346fea38ed391c7ea83b3d03354904f0f3bd39.zip | |
Add a feature flag for ASM
| -rw-r--r-- | src/librustc/front/feature_gate.rs | 32 | ||||
| -rw-r--r-- | src/libsyntax/visit.rs | 10 | ||||
| -rw-r--r-- | src/test/compile-fail/asm-gated.rs | 17 |
3 files changed, 42 insertions, 17 deletions
diff --git a/src/librustc/front/feature_gate.rs b/src/librustc/front/feature_gate.rs index 271ce6c0fd9..0f1d527163d 100644 --- a/src/librustc/front/feature_gate.rs +++ b/src/librustc/front/feature_gate.rs @@ -34,6 +34,7 @@ static KNOWN_FEATURES: &'static [(&'static str, Status)] = &[ ("macro_rules", Active), ("struct_variant", Active), ("once_fns", Active), + ("asm", Active), // These are used to test this portion of the compiler, they don't actually // mean anything @@ -108,26 +109,29 @@ impl Visitor<()> for Context { } } - ast::item_mac(ref mac) => { - match mac.node { - ast::mac_invoc_tt(ref path, _, _) => { - let rules = self.sess.ident_of("macro_rules"); - if path.segments.last().identifier == rules { - self.gate_feature("macro_rules", i.span, - "macro definitions are not \ - stable enough for use and are \ - subject to change"); - } - } - } - } - _ => {} } visit::walk_item(self, i, ()); } + fn visit_mac(&mut self, macro: &ast::mac, _: ()) { + let ast::mac_invoc_tt(ref path, _, _) = macro.node; + + if path.segments.last().identifier == self.sess.ident_of("macro_rules") { + self.gate_feature("macro_rules", path.span, "macro definitions are \ + not stable enough for use and are subject to change"); + } + + else if path.segments.last().identifier == self.sess.ident_of("asm") { + // NOTE: remove the false once the ASM feature is in the next snapshot + if false { + self.gate_feature("asm", path.span, "inline assembly is not \ + stable enough for use and is subject to change"); + } + } + } + fn visit_ty(&mut self, t: &ast::Ty, _: ()) { match t.node { ast::ty_closure(closure) if closure.onceness == ast::Once => { diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs index 8d717611760..5d50833ff31 100644 --- a/src/libsyntax/visit.rs +++ b/src/libsyntax/visit.rs @@ -90,6 +90,7 @@ pub trait Visitor<E:Clone> { walk_struct_def(self, s, i, g, n, e) } fn visit_struct_field(&mut self, s:@struct_field, e:E) { walk_struct_field(self, s, e) } + fn visit_mac(&mut self, m:&mac, e:E) { walk_mac(self, m, e); } } impl<E:Clone> Visitor<E> for @mut Visitor<E> { @@ -150,6 +151,9 @@ impl<E:Clone> Visitor<E> for @mut Visitor<E> { fn visit_struct_field(&mut self, a:@struct_field, e:E) { (*self).visit_struct_field(a, e) } + fn visit_mac(&mut self, macro:&mac, e:E) { + (*self).visit_mac(macro, e); + } } pub fn walk_crate<E:Clone, V:Visitor<E>>(visitor: &mut V, crate: &Crate, env: E) { @@ -247,7 +251,7 @@ pub fn walk_item<E:Clone, V:Visitor<E>>(visitor: &mut V, item: &item, env: E) { visitor.visit_trait_method(method, env.clone()) } } - item_mac(ref macro) => walk_mac(visitor, macro, env), + item_mac(ref macro) => visitor.visit_mac(macro, env), } } @@ -507,7 +511,7 @@ pub fn walk_stmt<E:Clone, V:Visitor<E>>(visitor: &mut V, statement: &Stmt, env: StmtExpr(expression, _) | StmtSemi(expression, _) => { visitor.visit_expr(expression, env) } - StmtMac(ref macro, _) => walk_mac(visitor, macro, env), + StmtMac(ref macro, _) => visitor.visit_mac(macro, env), } } @@ -644,7 +648,7 @@ pub fn walk_expr<E:Clone, V:Visitor<E>>(visitor: &mut V, expression: @Expr, env: walk_expr_opt(visitor, optional_expression, env.clone()) } ExprLogLevel => {} - ExprMac(ref macro) => walk_mac(visitor, macro, env.clone()), + ExprMac(ref macro) => visitor.visit_mac(macro, env.clone()), ExprParen(subexpression) => { visitor.visit_expr(subexpression, env.clone()) } diff --git a/src/test/compile-fail/asm-gated.rs b/src/test/compile-fail/asm-gated.rs new file mode 100644 index 00000000000..47f1574273b --- /dev/null +++ b/src/test/compile-fail/asm-gated.rs @@ -0,0 +1,17 @@ +// Copyright 2013 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// 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 +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// xfail-test + +fn main() { + unsafe { + asm!(""); //~ ERROR inline assembly is not stable enough + } +} |
