diff --git a/CHANGELOG.md b/CHANGELOG.md index 636ca3f4f..6ef4e596a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ All notable changes to this project will be documented in this file. ## 0.0.87 — ?? +* New lints: [`builtin_type_shadow`] * Fix FP in [`zero_prefixed_literal`] and `0b`/`Oo` ## 0.0.86 — 2016-08-28 @@ -178,6 +179,7 @@ All notable changes to this project will be documented in this file. [`bool_comparison`]: https://github.com/Manishearth/rust-clippy/wiki#bool_comparison [`box_vec`]: https://github.com/Manishearth/rust-clippy/wiki#box_vec [`boxed_local`]: https://github.com/Manishearth/rust-clippy/wiki#boxed_local +[`builtin_type_shadow`]: https://github.com/Manishearth/rust-clippy/wiki#builtin_type_shadow [`cast_possible_truncation`]: https://github.com/Manishearth/rust-clippy/wiki#cast_possible_truncation [`cast_possible_wrap`]: https://github.com/Manishearth/rust-clippy/wiki#cast_possible_wrap [`cast_precision_loss`]: https://github.com/Manishearth/rust-clippy/wiki#cast_precision_loss diff --git a/README.md b/README.md index 64d2932ed..d305908ea 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Table of contents: ## Lints -There are 169 lints included in this crate: +There are 170 lints included in this crate: name | default | triggers on ---------------------------------------------------------------------------------------------------------------------|---------|---------------------------------------------------------------------------------------------------------------------------------- @@ -33,6 +33,7 @@ name [bool_comparison](https://github.com/Manishearth/rust-clippy/wiki#bool_comparison) | warn | comparing a variable to a boolean, e.g. `if x == true` [box_vec](https://github.com/Manishearth/rust-clippy/wiki#box_vec) | warn | usage of `Box>`, vector elements are already on the heap [boxed_local](https://github.com/Manishearth/rust-clippy/wiki#boxed_local) | warn | using `Box` where unnecessary +[builtin_type_shadow](https://github.com/Manishearth/rust-clippy/wiki#builtin_type_shadow) | warn | shadowing a builtin type [cast_possible_truncation](https://github.com/Manishearth/rust-clippy/wiki#cast_possible_truncation) | allow | casts that may cause truncation of the value, e.g `x as u8` where `x: u32`, or `x as i32` where `x: f32` [cast_possible_wrap](https://github.com/Manishearth/rust-clippy/wiki#cast_possible_wrap) | allow | casts that may cause wrapping around the value, e.g `x as i32` where `x: u32` and `x > i32::MAX` [cast_precision_loss](https://github.com/Manishearth/rust-clippy/wiki#cast_precision_loss) | allow | casts that cause loss of precision, e.g `x as f32` where `x: u64` diff --git a/clippy_lints/src/lib.rs b/clippy_lints/src/lib.rs index c5ce53e66..12370fb26 100644 --- a/clippy_lints/src/lib.rs +++ b/clippy_lints/src/lib.rs @@ -378,6 +378,7 @@ pub fn register_plugins(reg: &mut rustc_plugin::Registry) { misc::MODULO_ONE, misc::REDUNDANT_PATTERN, misc::TOPLEVEL_REF_ARG, + misc_early::BUILTIN_TYPE_SHADOW, misc_early::DOUBLE_NEG, misc_early::DUPLICATE_UNDERSCORE_ARGUMENT, misc_early::MIXED_CASE_HEX_LITERALS, diff --git a/clippy_lints/src/misc_early.rs b/clippy_lints/src/misc_early.rs index 83ba98033..61e4530a1 100644 --- a/clippy_lints/src/misc_early.rs +++ b/clippy_lints/src/misc_early.rs @@ -4,7 +4,7 @@ use std::char; use syntax::ast::*; use syntax::codemap::Span; use syntax::visit::FnKind; -use utils::{span_lint, span_help_and_lint, snippet, snippet_opt, span_lint_and_then}; +use utils::{constants, span_lint, span_help_and_lint, snippet, snippet_opt, span_lint_and_then}; /// **What it does:** Checks for structure field patterns bound to wildcards. /// @@ -141,6 +141,27 @@ declare_lint! { "integer literals starting with `0`" } +/// **What it does:** Warns if a generic shadows a built-in type. +/// +/// **Why is this bad?** This gives surprising type errors. +/// +/// **Known problems:** None. +/// +/// **Example:** +/// +/// ```rust +/// impl Foo { +/// fn impl_func(&self) -> u32 { +/// 42 +/// } +/// } +/// ``` +declare_lint! { + pub BUILTIN_TYPE_SHADOW, + Warn, + "shadowing a builtin type" +} + #[derive(Copy, Clone)] pub struct MiscEarly; @@ -149,11 +170,23 @@ impl LintPass for MiscEarly { fn get_lints(&self) -> LintArray { lint_array!(UNNEEDED_FIELD_PATTERN, DUPLICATE_UNDERSCORE_ARGUMENT, REDUNDANT_CLOSURE_CALL, DOUBLE_NEG, MIXED_CASE_HEX_LITERALS, UNSEPARATED_LITERAL_SUFFIX, - ZERO_PREFIXED_LITERAL) + ZERO_PREFIXED_LITERAL, BUILTIN_TYPE_SHADOW) } } impl EarlyLintPass for MiscEarly { + fn check_generics(&mut self, cx: &EarlyContext, gen: &Generics) { + for ty in &gen.ty_params { + let name = ty.ident.name.as_str(); + if constants::BUILTIN_TYPES.contains(&&*name) { + span_lint(cx, + BUILTIN_TYPE_SHADOW, + ty.span, + &format!("This generic shadows the built-in type `{}`", name)); + } + } + } + fn check_pat(&mut self, cx: &EarlyContext, pat: &Pat) { if let PatKind::Struct(ref npat, ref pfields, _) = pat.node { let mut wilds = 0; diff --git a/clippy_lints/src/utils/constants.rs b/clippy_lints/src/utils/constants.rs new file mode 100644 index 000000000..179c251e3 --- /dev/null +++ b/clippy_lints/src/utils/constants.rs @@ -0,0 +1,21 @@ +//! This module contains some useful constants. + +#![deny(missing_docs_in_private_items)] + +/// List of the built-in types names. +/// +/// See also [the reference][reference-types] for a list of such types. +/// +/// [reference-types]: https://doc.rust-lang.org/reference.html#types +pub const BUILTIN_TYPES: &'static [&'static str] = &[ + "i8", "u8", + "i16", "u16", + "i32", "u32", + "i64", "u64", + "isize", "usize", + "f32", + "f64", + "bool", + "str", + "char", +]; diff --git a/clippy_lints/src/utils/mod.rs b/clippy_lints/src/utils/mod.rs index 9e9ff65ac..9e6ee0fbf 100644 --- a/clippy_lints/src/utils/mod.rs +++ b/clippy_lints/src/utils/mod.rs @@ -22,6 +22,7 @@ use syntax::ptr::P; pub mod cargo; pub mod comparisons; pub mod conf; +pub mod constants; mod hir; pub mod paths; pub mod sugg; diff --git a/tests/compile-fail/builtin-type-shadow.rs b/tests/compile-fail/builtin-type-shadow.rs new file mode 100644 index 000000000..172875a6b --- /dev/null +++ b/tests/compile-fail/builtin-type-shadow.rs @@ -0,0 +1,11 @@ +#![feature(plugin)] +#![plugin(clippy)] +#![deny(builtin_type_shadow)] + +fn foo(a: u32) -> u32 { //~ERROR shadows the built-in type `u32` + 42 //~ERROR E0308 + // ^ rustc's type error +} + +fn main() { +}