From b5c6ab20b7d1f4d6b0cc31c2987b2e0f8ea43e0c Mon Sep 17 00:00:00 2001 From: Huon Wilson Date: Wed, 4 Mar 2015 18:05:38 +1100 Subject: Run feature-gating on the final AST passed to the compiler. This ensures we catch everything; previously, an unknown attribute inserted by #[cfg_attr(...)] in a macro expansion would not be detected. --- src/libsyntax/feature_gate.rs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'src/libsyntax') diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index bc955259ab5..fcfc1460484 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -349,6 +349,7 @@ struct Context<'a> { features: Vec<&'static str>, span_handler: &'a SpanHandler, cm: &'a CodeMap, + do_warnings: bool, } impl<'a> Context<'a> { @@ -361,7 +362,7 @@ impl<'a> Context<'a> { } fn warn_feature(&self, feature: &str, span: Span, explain: &str) { - if !self.has_feature(feature) { + if !self.has_feature(feature) && self.do_warnings { emit_feature_warn(self.span_handler, feature, span, explain); } } @@ -700,6 +701,7 @@ impl<'a, 'v> Visitor<'v> for PostExpansionVisitor<'a> { } fn check_crate_inner(cm: &CodeMap, span_handler: &SpanHandler, krate: &ast::Crate, + do_warnings: bool, check: F) -> Features where F: FnOnce(&mut Context, &ast::Crate) @@ -707,6 +709,7 @@ fn check_crate_inner(cm: &CodeMap, span_handler: &SpanHandler, krate: &ast::C let mut cx = Context { features: Vec::new(), span_handler: span_handler, + do_warnings: do_warnings, cm: cm, }; @@ -786,13 +789,14 @@ fn check_crate_inner(cm: &CodeMap, span_handler: &SpanHandler, krate: &ast::C pub fn check_crate_macros(cm: &CodeMap, span_handler: &SpanHandler, krate: &ast::Crate) -> Features { - check_crate_inner(cm, span_handler, krate, + check_crate_inner(cm, span_handler, krate, true, |ctx, krate| visit::walk_crate(&mut MacroVisitor { context: ctx }, krate)) } -pub fn check_crate(cm: &CodeMap, span_handler: &SpanHandler, krate: &ast::Crate) --> Features { - check_crate_inner(cm, span_handler, krate, +pub fn check_crate(cm: &CodeMap, span_handler: &SpanHandler, krate: &ast::Crate, + do_warnings: bool) -> Features +{ + check_crate_inner(cm, span_handler, krate, do_warnings, |ctx, krate| visit::walk_crate(&mut PostExpansionVisitor { context: ctx }, krate)) } -- cgit 1.4.1-3-g733a5