about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2018-06-08 18:24:57 -0700
committerEsteban Küber <esteban@kuber.com.ar>2018-06-26 21:13:39 -0700
commit6a2003e4e30e368ce89a76efc4f6dbf824d01511 (patch)
tree8453e72b8ca2b8f27347e6d142a97ec87bebbe66 /src
parentd6e2239a0718b230444f7f218add58db5732817a (diff)
downloadrust-6a2003e4e30e368ce89a76efc4f6dbf824d01511.tar.gz
rust-6a2003e4e30e368ce89a76efc4f6dbf824d01511.zip
Lint inner fn marked as `#[test]`
Diffstat (limited to 'src')
-rw-r--r--src/librustc_lint/builtin.rs42
-rw-r--r--src/librustc_lint/lib.rs1
-rw-r--r--src/test/ui/lint/test-inner-fn.rs29
-rw-r--r--src/test/ui/lint/test-inner-fn.stderr16
4 files changed, 87 insertions, 1 deletions
diff --git a/src/librustc_lint/builtin.rs b/src/librustc_lint/builtin.rs
index dfbfcfccf7c..28e59237854 100644
--- a/src/librustc_lint/builtin.rs
+++ b/src/librustc_lint/builtin.rs
@@ -1704,7 +1704,6 @@ impl LintPass for SoftLints {
     }
 }
 
-
 declare_lint! {
     pub ELLIPSIS_INCLUSIVE_RANGE_PATTERNS,
     Allow,
@@ -1739,3 +1738,44 @@ impl EarlyLintPass for EllipsisInclusiveRangePatterns {
         }
     }
 }
+
+declare_lint! {
+    UNTESTABLE_METHOD,
+    Warn,
+    "detects untestable method marked as #[test]"
+}
+
+pub struct UntestableMethod;
+
+impl LintPass for UntestableMethod {
+    fn get_lints(&self) -> LintArray {
+        lint_array!(UNTESTABLE_METHOD)
+    }
+}
+
+impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UntestableMethod {
+    fn check_item(&mut self, cx: &LateContext, it: &hir::Item) {
+        match it.node {
+            hir::ItemFn(..) => {
+                for attr in &it.attrs {
+                    if attr.name() == "test" {
+                        let parent = cx.tcx.hir.get_parent(it.id);
+                        match cx.tcx.hir.find(parent) {
+                            Some(hir_map::NodeItem(hir::Item {node: hir::ItemMod(_), ..})) |
+                            None => {}
+                            _ => {
+                                cx.struct_span_lint(
+                                    UNTESTABLE_METHOD,
+                                    attr.span,
+                                    "cannot test inner function",
+                                ).emit();
+                            }
+                        }
+                        break;
+                    }
+                }
+            }
+            _ => return,
+        };
+    }
+}
diff --git a/src/librustc_lint/lib.rs b/src/librustc_lint/lib.rs
index 13e97a9d3e5..6c39af6dad2 100644
--- a/src/librustc_lint/lib.rs
+++ b/src/librustc_lint/lib.rs
@@ -130,6 +130,7 @@ pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) {
         MutableTransmutes: MutableTransmutes,
         UnionsWithDropFields: UnionsWithDropFields,
         UnreachablePub: UnreachablePub,
+        UntestableMethod: UntestableMethod,
         TypeAliasBounds: TypeAliasBounds,
         UnusedBrokenConst: UnusedBrokenConst,
         TrivialConstraints: TrivialConstraints,
diff --git a/src/test/ui/lint/test-inner-fn.rs b/src/test/ui/lint/test-inner-fn.rs
new file mode 100644
index 00000000000..112cc2d7672
--- /dev/null
+++ b/src/test/ui/lint/test-inner-fn.rs
@@ -0,0 +1,29 @@
+// Copyright 2018 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.
+
+// compile-flags: --test -D untestable_method
+
+#[test]
+fn foo() {
+    #[test] //~ ERROR cannot test inner function [untestable_method]
+    fn bar() {}
+    bar();
+}
+
+mod x {
+    #[test]
+    fn foo() {
+        #[test] //~ ERROR cannot test inner function [untestable_method]
+        fn bar() {}
+        bar();
+    }
+}
+
+fn main() {}
diff --git a/src/test/ui/lint/test-inner-fn.stderr b/src/test/ui/lint/test-inner-fn.stderr
new file mode 100644
index 00000000000..a153f11e4cf
--- /dev/null
+++ b/src/test/ui/lint/test-inner-fn.stderr
@@ -0,0 +1,16 @@
+error: cannot test inner function
+  --> $DIR/test-inner-fn.rs:15:5
+   |
+LL |     #[test] //~ ERROR cannot test inner function [untestable_method]
+   |     ^^^^^^^
+   |
+   = note: requested on the command line with `-D untestable-method`
+
+error: cannot test inner function
+  --> $DIR/test-inner-fn.rs:23:9
+   |
+LL |         #[test] //~ ERROR cannot test inner function [untestable_method]
+   |         ^^^^^^^
+
+error: aborting due to 2 previous errors
+