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
[`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
## Lints
-There are 169 lints included in this crate:
+There are 170 lints included in this crate:
name | default | triggers on
---------------------------------------------------------------------------------------------------------------------|---------|----------------------------------------------------------------------------------------------------------------------------------
[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<Vec<T>>`, vector elements are already on the heap
[boxed_local](https://github.com/Manishearth/rust-clippy/wiki#boxed_local) | warn | using `Box<T>` 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`
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,
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.
///
"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<u32> Foo<u32> {
+/// fn impl_func(&self) -> u32 {
+/// 42
+/// }
+/// }
+/// ```
+declare_lint! {
+ pub BUILTIN_TYPE_SHADOW,
+ Warn,
+ "shadowing a builtin type"
+}
+
#[derive(Copy, Clone)]
pub struct 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;
--- /dev/null
+//! 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",
+];
pub mod cargo;
pub mod comparisons;
pub mod conf;
+pub mod constants;
mod hir;
pub mod paths;
pub mod sugg;
--- /dev/null
+#![feature(plugin)]
+#![plugin(clippy)]
+#![deny(builtin_type_shadow)]
+
+fn foo<u32>(a: u32) -> u32 { //~ERROR shadows the built-in type `u32`
+ 42 //~ERROR E0308
+ // ^ rustc's type error
+}
+
+fn main() {
+}