about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorest31 <MTest31@outlook.com>2017-05-02 04:38:46 +0200
committerest31 <MTest31@outlook.com>2017-05-02 05:15:26 +0200
commit6cc765dcad14e305f892398d16e270b480eb435b (patch)
tree0d1e8badb0d41873d7b49df8f5390b63bb60d3c4 /src
parent4cb396c68088f38e517ac8890030d17a969e57ba (diff)
downloadrust-6cc765dcad14e305f892398d16e270b480eb435b.tar.gz
rust-6cc765dcad14e305f892398d16e270b480eb435b.zip
Add a lint to disallow anonymous parameters
Diffstat (limited to 'src')
-rw-r--r--src/librustc_lint/builtin.rs39
-rw-r--r--src/librustc_lint/lib.rs5
-rw-r--r--src/test/compile-fail/anon-params-deprecated.rs25
3 files changed, 69 insertions, 0 deletions
diff --git a/src/librustc_lint/builtin.rs b/src/librustc_lint/builtin.rs
index 57ed2988096..c9ec152841b 100644
--- a/src/librustc_lint/builtin.rs
+++ b/src/librustc_lint/builtin.rs
@@ -45,6 +45,7 @@ use syntax::ast;
 use syntax::attr;
 use syntax::feature_gate::{AttributeGate, AttributeType, Stability, deprecated_attributes};
 use syntax_pos::Span;
+use syntax::symbol::keywords;
 
 use rustc::hir::{self, PatKind};
 use rustc::hir::intravisit::FnKind;
@@ -606,6 +607,44 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MissingDebugImplementations {
 }
 
 declare_lint! {
+    pub ANONYMOUS_PARAMETERS,
+    Allow,
+    "detects anonymous parameters"
+}
+
+/// Checks for use of anonymous parameters (RFC 1685)
+#[derive(Clone)]
+pub struct AnonymousParameters;
+
+impl LintPass for AnonymousParameters {
+    fn get_lints(&self) -> LintArray {
+        lint_array!(ANONYMOUS_PARAMETERS)
+    }
+}
+
+impl EarlyLintPass for AnonymousParameters {
+    fn check_trait_item(&mut self, cx: &EarlyContext, it: &ast::TraitItem) {
+        match it.node {
+            ast::TraitItemKind::Method(ref sig, _) => {
+                for arg in sig.decl.inputs.iter() {
+                    match arg.pat.node {
+                        ast::PatKind::Ident(_, ident, None) => {
+                            if ident.node.name == keywords::Invalid.name() {
+                                cx.span_lint(ANONYMOUS_PARAMETERS,
+                                             arg.pat.span,
+                                             "use of deprecated anonymous parameter");
+                            }
+                        }
+                        _ => (),
+                    }
+                }
+            },
+            _ => (),
+        }
+    }
+}
+
+declare_lint! {
     DEPRECATED_ATTR,
     Warn,
     "detects use of deprecated attributes"
diff --git a/src/librustc_lint/lib.rs b/src/librustc_lint/lib.rs
index 8d759d89135..c1c14cb1fd2 100644
--- a/src/librustc_lint/lib.rs
+++ b/src/librustc_lint/lib.rs
@@ -112,6 +112,7 @@ pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) {
     add_early_builtin!(sess,
                        UnusedParens,
                        UnusedImportBraces,
+                       AnonymousParameters,
                        );
 
     add_early_builtin_with_new!(sess,
@@ -244,6 +245,10 @@ pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) {
             id: LintId::of(MISSING_FRAGMENT_SPECIFIER),
             reference: "issue #40107 <https://github.com/rust-lang/rust/issues/40107>",
         },
+        FutureIncompatibleInfo {
+            id: LintId::of(ANONYMOUS_PARAMETERS),
+            reference: "issue #41686 <https://github.com/rust-lang/rust/issues/41686>",
+        },
         ]);
 
     // Register renamed and removed lints
diff --git a/src/test/compile-fail/anon-params-deprecated.rs b/src/test/compile-fail/anon-params-deprecated.rs
new file mode 100644
index 00000000000..76edae17dc1
--- /dev/null
+++ b/src/test/compile-fail/anon-params-deprecated.rs
@@ -0,0 +1,25 @@
+// Copyright 2017 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.
+
+#![forbid(anonymous_parameters)]
+// Test for the anonymous_parameters deprecation lint (RFC 1685)
+
+trait T {
+    fn foo(i32); //~ ERROR use of deprecated anonymous parameter
+                 //~| WARNING hard error
+
+    fn bar_with_default_impl(String, String) {}
+    //~^ ERROR use of deprecated anonymous parameter
+    //~| WARNING hard error
+    //~| ERROR use of deprecated anonymous parameter
+    //~| WARNING hard error
+}
+
+fn main() {}