diff options
| author | Corey Farwell <coreyf@rwell.org> | 2017-05-02 09:09:58 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-05-02 09:09:58 -0400 |
| commit | 4733ee7eb4be269e751e913fd1be1382ce9bf6d6 (patch) | |
| tree | 3fee4163ba5e6ad3ffb723e06d2db234a9a75391 | |
| parent | 7dbb93a39150aebdccb51321bc5872b15a204085 (diff) | |
| parent | 6cc765dcad14e305f892398d16e270b480eb435b (diff) | |
| download | rust-4733ee7eb4be269e751e913fd1be1382ce9bf6d6.tar.gz rust-4733ee7eb4be269e751e913fd1be1382ce9bf6d6.zip | |
Rollup merge of #41692 - est31:anon_params, r=eddyb
Add a lint to disallow anonymous parameters Adds a (allow by default) lint to disallow anonymous parameters, like it was decided in RFC 1685 (rust-lang/rfcs#1685). cc tracking issue #41686
| -rw-r--r-- | src/librustc_lint/builtin.rs | 39 | ||||
| -rw-r--r-- | src/librustc_lint/lib.rs | 5 | ||||
| -rw-r--r-- | src/test/compile-fail/anon-params-deprecated.rs | 25 |
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() {} |
