From e72d49a806e26ca901376bcdc395dbf5e8895150 Mon Sep 17 00:00:00 2001 From: David Creswick Date: Tue, 22 Apr 2014 20:09:21 -0500 Subject: [PATCH] Apply lint attrs to individual "use" declarations Fixes #10534 --- src/librustc/middle/lint.rs | 3 ++ src/libsyntax/ast_util.rs | 12 +++++-- ...int-directives-on-use-items-issue-10534.rs | 33 +++++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 src/test/compile-fail/lint-directives-on-use-items-issue-10534.rs diff --git a/src/librustc/middle/lint.rs b/src/librustc/middle/lint.rs index 6ce815d9bc4..87161343b88 100644 --- a/src/librustc/middle/lint.rs +++ b/src/librustc/middle/lint.rs @@ -1644,6 +1644,9 @@ impl<'a> Visitor<()> for Context<'a> { fn visit_view_item(&mut self, i: &ast::ViewItem, _: ()) { self.with_lint_attrs(i.attrs.as_slice(), |cx| { check_attrs_usage(cx, i.attrs.as_slice()); + + cx.visit_ids(|v| v.visit_view_item(i, ())); + visit::walk_view_item(cx, i, ()); }) } diff --git a/src/libsyntax/ast_util.rs b/src/libsyntax/ast_util.rs index 437f865b449..551fb054131 100644 --- a/src/libsyntax/ast_util.rs +++ b/src/libsyntax/ast_util.rs @@ -1,4 +1,4 @@ -// Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT +// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // @@ -396,6 +396,13 @@ impl<'a, O: IdVisitingOperation> Visitor<()> for IdVisitor<'a, O> { } fn visit_view_item(&mut self, view_item: &ViewItem, env: ()) { + if !self.pass_through_items { + if self.visited_outermost { + return; + } else { + self.visited_outermost = true; + } + } match view_item.node { ViewItemExternCrate(_, _, node_id) => { self.operation.visit_id(node_id) @@ -417,7 +424,8 @@ impl<'a, O: IdVisitingOperation> Visitor<()> for IdVisitor<'a, O> { } } } - visit::walk_view_item(self, view_item, env) + visit::walk_view_item(self, view_item, env); + self.visited_outermost = false; } fn visit_foreign_item(&mut self, foreign_item: &ForeignItem, env: ()) { diff --git a/src/test/compile-fail/lint-directives-on-use-items-issue-10534.rs b/src/test/compile-fail/lint-directives-on-use-items-issue-10534.rs new file mode 100644 index 00000000000..e920bfd412d --- /dev/null +++ b/src/test/compile-fail/lint-directives-on-use-items-issue-10534.rs @@ -0,0 +1,33 @@ +// Copyright 2014 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![deny(unused_imports)] + +// The aim of this test is to ensure that deny/allow/warn directives +// are applied to individual "use" statements instead of silently +// ignored. + +#[allow(dead_code)] +mod a { pub static x: int = 3; pub static y: int = 4; } + +mod b { + use a::x; //~ ERROR: unused import + #[allow(unused_imports)] + use a::y; // no error here +} + +#[allow(unused_imports)] +mod c { + use a::x; + #[deny(unused_imports)] + use a::y; //~ ERROR: unused import +} + +fn main() {}