]> git.lizzy.rs Git - rust.git/commitdiff
Add a lint to disallow anonymous parameters
authorest31 <MTest31@outlook.com>
Tue, 2 May 2017 02:38:46 +0000 (04:38 +0200)
committerest31 <MTest31@outlook.com>
Tue, 2 May 2017 03:15:26 +0000 (05:15 +0200)
src/librustc_lint/builtin.rs
src/librustc_lint/lib.rs
src/test/compile-fail/anon-params-deprecated.rs [new file with mode: 0644]

index 57ed298809635d5093324e94f95c9431a9247900..c9ec152841b2025a1e57e8b09344355aba06a405 100644 (file)
@@ -45,6 +45,7 @@
 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;
@@ -605,6 +606,44 @@ fn check_item(&mut self, cx: &LateContext, item: &hir::Item) {
     }
 }
 
+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,
index 8d759d89135ac90ca505853dce307c241b666c29..c1c14cb1fd29e3d8f3e6d6500a193d0f65fa4367 100644 (file)
@@ -112,6 +112,7 @@ macro_rules! add_lint_group {
     add_early_builtin!(sess,
                        UnusedParens,
                        UnusedImportBraces,
+                       AnonymousParameters,
                        );
 
     add_early_builtin_with_new!(sess,
@@ -244,6 +245,10 @@ macro_rules! add_lint_group {
             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 (file)
index 0000000..76edae1
--- /dev/null
@@ -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() {}