mirror of
https://github.com/rust-lang/rust-clippy
synced 2025-02-16 22:18:40 +00:00
Add a builtin_type_shadow
lint
This commit is contained in:
parent
39d4a1b323
commit
d87f137254
7 changed files with 73 additions and 3 deletions
|
@ -2,6 +2,7 @@
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
## 0.0.87 — ??
|
## 0.0.87 — ??
|
||||||
|
* New lints: [`builtin_type_shadow`]
|
||||||
* Fix FP in [`zero_prefixed_literal`] and `0b`/`Oo`
|
* Fix FP in [`zero_prefixed_literal`] and `0b`/`Oo`
|
||||||
|
|
||||||
## 0.0.86 — 2016-08-28
|
## 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
|
[`bool_comparison`]: https://github.com/Manishearth/rust-clippy/wiki#bool_comparison
|
||||||
[`box_vec`]: https://github.com/Manishearth/rust-clippy/wiki#box_vec
|
[`box_vec`]: https://github.com/Manishearth/rust-clippy/wiki#box_vec
|
||||||
[`boxed_local`]: https://github.com/Manishearth/rust-clippy/wiki#boxed_local
|
[`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_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_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
|
[`cast_precision_loss`]: https://github.com/Manishearth/rust-clippy/wiki#cast_precision_loss
|
||||||
|
|
|
@ -17,7 +17,7 @@ Table of contents:
|
||||||
|
|
||||||
## Lints
|
## Lints
|
||||||
|
|
||||||
There are 169 lints included in this crate:
|
There are 170 lints included in this crate:
|
||||||
|
|
||||||
name | default | triggers on
|
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`
|
[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
|
[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
|
[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_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_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`
|
[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`
|
||||||
|
|
|
@ -378,6 +378,7 @@ pub fn register_plugins(reg: &mut rustc_plugin::Registry) {
|
||||||
misc::MODULO_ONE,
|
misc::MODULO_ONE,
|
||||||
misc::REDUNDANT_PATTERN,
|
misc::REDUNDANT_PATTERN,
|
||||||
misc::TOPLEVEL_REF_ARG,
|
misc::TOPLEVEL_REF_ARG,
|
||||||
|
misc_early::BUILTIN_TYPE_SHADOW,
|
||||||
misc_early::DOUBLE_NEG,
|
misc_early::DOUBLE_NEG,
|
||||||
misc_early::DUPLICATE_UNDERSCORE_ARGUMENT,
|
misc_early::DUPLICATE_UNDERSCORE_ARGUMENT,
|
||||||
misc_early::MIXED_CASE_HEX_LITERALS,
|
misc_early::MIXED_CASE_HEX_LITERALS,
|
||||||
|
|
|
@ -4,7 +4,7 @@ use std::char;
|
||||||
use syntax::ast::*;
|
use syntax::ast::*;
|
||||||
use syntax::codemap::Span;
|
use syntax::codemap::Span;
|
||||||
use syntax::visit::FnKind;
|
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.
|
/// **What it does:** Checks for structure field patterns bound to wildcards.
|
||||||
///
|
///
|
||||||
|
@ -141,6 +141,27 @@ declare_lint! {
|
||||||
"integer literals starting with `0`"
|
"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)]
|
#[derive(Copy, Clone)]
|
||||||
pub struct MiscEarly;
|
pub struct MiscEarly;
|
||||||
|
@ -149,11 +170,23 @@ impl LintPass for MiscEarly {
|
||||||
fn get_lints(&self) -> LintArray {
|
fn get_lints(&self) -> LintArray {
|
||||||
lint_array!(UNNEEDED_FIELD_PATTERN, DUPLICATE_UNDERSCORE_ARGUMENT, REDUNDANT_CLOSURE_CALL,
|
lint_array!(UNNEEDED_FIELD_PATTERN, DUPLICATE_UNDERSCORE_ARGUMENT, REDUNDANT_CLOSURE_CALL,
|
||||||
DOUBLE_NEG, MIXED_CASE_HEX_LITERALS, UNSEPARATED_LITERAL_SUFFIX,
|
DOUBLE_NEG, MIXED_CASE_HEX_LITERALS, UNSEPARATED_LITERAL_SUFFIX,
|
||||||
ZERO_PREFIXED_LITERAL)
|
ZERO_PREFIXED_LITERAL, BUILTIN_TYPE_SHADOW)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl EarlyLintPass for MiscEarly {
|
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) {
|
fn check_pat(&mut self, cx: &EarlyContext, pat: &Pat) {
|
||||||
if let PatKind::Struct(ref npat, ref pfields, _) = pat.node {
|
if let PatKind::Struct(ref npat, ref pfields, _) = pat.node {
|
||||||
let mut wilds = 0;
|
let mut wilds = 0;
|
||||||
|
|
21
clippy_lints/src/utils/constants.rs
Normal file
21
clippy_lints/src/utils/constants.rs
Normal file
|
@ -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",
|
||||||
|
];
|
|
@ -22,6 +22,7 @@ use syntax::ptr::P;
|
||||||
pub mod cargo;
|
pub mod cargo;
|
||||||
pub mod comparisons;
|
pub mod comparisons;
|
||||||
pub mod conf;
|
pub mod conf;
|
||||||
|
pub mod constants;
|
||||||
mod hir;
|
mod hir;
|
||||||
pub mod paths;
|
pub mod paths;
|
||||||
pub mod sugg;
|
pub mod sugg;
|
||||||
|
|
11
tests/compile-fail/builtin-type-shadow.rs
Normal file
11
tests/compile-fail/builtin-type-shadow.rs
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
#![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() {
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue