about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2014-04-24 17:16:14 -0700
committerbors <bors@rust-lang.org>2014-04-24 17:16:14 -0700
commit5ea0509685720563f8ede5e5764c603a38c524c8 (patch)
treebe1a04881018a4ffdda60e9e334155f81fa6b1b1 /src
parentb55394415ab63adf32036f63595f3bba3e1c9098 (diff)
parente72d49a806e26ca901376bcdc395dbf5e8895150 (diff)
downloadrust-5ea0509685720563f8ede5e5764c603a38c524c8.tar.gz
rust-5ea0509685720563f8ede5e5764c603a38c524c8.zip
auto merge of #13671 : dcrewi/rust/lint-directives-on-use-items, r=alexcrichton
Fixes #10534
Diffstat (limited to 'src')
-rw-r--r--src/librustc/middle/lint.rs3
-rw-r--r--src/libsyntax/ast_util.rs12
-rw-r--r--src/test/compile-fail/lint-directives-on-use-items-issue-10534.rs33
3 files changed, 46 insertions, 2 deletions
diff --git a/src/librustc/middle/lint.rs b/src/librustc/middle/lint.rs
index 05a225d8953..51aafb90ac6 100644
--- a/src/librustc/middle/lint.rs
+++ b/src/librustc/middle/lint.rs
@@ -1638,6 +1638,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 adb97af7490..c80c4dc3a22 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 <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.
+
+#![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() {}