357 lines
8.2 KiB
Rust
357 lines
8.2 KiB
Rust
// Copyright 2012-2015 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.
|
|
|
|
//! Some lints that are built in to the compiler.
|
|
//!
|
|
//! These are the built-in lints that are emitted direct in the main
|
|
//! compiler code, rather than using their own custom pass. Those
|
|
//! lints are all available in `rustc_lint::builtin`.
|
|
|
|
use errors::DiagnosticBuilder;
|
|
use lint::{LintPass, LateLintPass, LintArray};
|
|
use session::Session;
|
|
use session::config::Epoch;
|
|
use syntax::codemap::Span;
|
|
|
|
declare_lint! {
|
|
pub EXCEEDING_BITSHIFTS,
|
|
Deny,
|
|
"shift exceeds the type's number of bits"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub CONST_ERR,
|
|
Warn,
|
|
"constant evaluation detected erroneous expression"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub UNUSED_IMPORTS,
|
|
Warn,
|
|
"imports that are never used"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub UNUSED_EXTERN_CRATES,
|
|
Allow,
|
|
"extern crates that are never used"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub UNUSED_QUALIFICATIONS,
|
|
Allow,
|
|
"detects unnecessarily qualified names"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub UNKNOWN_LINTS,
|
|
Warn,
|
|
"unrecognized lint attribute"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub UNUSED_VARIABLES,
|
|
Warn,
|
|
"detect variables which are not used in any way"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub UNUSED_ASSIGNMENTS,
|
|
Warn,
|
|
"detect assignments that will never be read"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub DEAD_CODE,
|
|
Warn,
|
|
"detect unused, unexported items"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub UNREACHABLE_CODE,
|
|
Warn,
|
|
"detects unreachable code paths"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub UNREACHABLE_PATTERNS,
|
|
Warn,
|
|
"detects unreachable patterns"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub UNUSED_MACROS,
|
|
Warn,
|
|
"detects macros that were not used"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub WARNINGS,
|
|
Warn,
|
|
"mass-change the level for lints which produce warnings"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub UNUSED_FEATURES,
|
|
Warn,
|
|
"unused or unknown features found in crate-level #[feature] directives"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub STABLE_FEATURES,
|
|
Warn,
|
|
"stable features found in #[feature] directive"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub UNKNOWN_CRATE_TYPES,
|
|
Deny,
|
|
"unknown crate type found in #[crate_type] directive"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub TRIVIAL_CASTS,
|
|
Allow,
|
|
"detects trivial casts which could be removed"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub TRIVIAL_NUMERIC_CASTS,
|
|
Allow,
|
|
"detects trivial casts of numeric types which could be removed"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub PRIVATE_IN_PUBLIC,
|
|
Warn,
|
|
"detect private items in public interfaces not caught by the old implementation"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub PUB_USE_OF_PRIVATE_EXTERN_CRATE,
|
|
Deny,
|
|
"detect public re-exports of private extern crates"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub INVALID_TYPE_PARAM_DEFAULT,
|
|
Deny,
|
|
"type parameter default erroneously allowed in invalid location"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub RENAMED_AND_REMOVED_LINTS,
|
|
Warn,
|
|
"lints that have been renamed or removed"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub RESOLVE_TRAIT_ON_DEFAULTED_UNIT,
|
|
Deny,
|
|
"attempt to resolve a trait on an expression whose type cannot be inferred but which \
|
|
currently defaults to ()"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub SAFE_EXTERN_STATICS,
|
|
Deny,
|
|
"safe access to extern statics was erroneously allowed"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub SAFE_PACKED_BORROWS,
|
|
Warn,
|
|
"safe borrows of fields of packed structs were was erroneously allowed"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub PATTERNS_IN_FNS_WITHOUT_BODY,
|
|
Warn,
|
|
"patterns in functions without body were erroneously allowed"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub LEGACY_DIRECTORY_OWNERSHIP,
|
|
Deny,
|
|
"non-inline, non-`#[path]` modules (e.g. `mod foo;`) were erroneously allowed in some files \
|
|
not named `mod.rs`"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub LEGACY_IMPORTS,
|
|
Deny,
|
|
"detects names that resolve to ambiguous glob imports with RFC 1560"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub LEGACY_CONSTRUCTOR_VISIBILITY,
|
|
Deny,
|
|
"detects use of struct constructors that would be invisible with new visibility rules"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub MISSING_FRAGMENT_SPECIFIER,
|
|
Deny,
|
|
"detects missing fragment specifiers in unused `macro_rules!` patterns"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub PARENTHESIZED_PARAMS_IN_TYPES_AND_MODULES,
|
|
Deny,
|
|
"detects parenthesized generic parameters in type and module names"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub LATE_BOUND_LIFETIME_ARGUMENTS,
|
|
Warn,
|
|
"detects generic lifetime arguments in path segments with late bound lifetime parameters"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub INCOHERENT_FUNDAMENTAL_IMPLS,
|
|
Warn,
|
|
"potentially-conflicting impls were erroneously allowed"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub DEPRECATED,
|
|
Warn,
|
|
"detects use of deprecated items"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub UNUSED_UNSAFE,
|
|
Warn,
|
|
"unnecessary use of an `unsafe` block"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub UNUSED_MUT,
|
|
Warn,
|
|
"detect mut variables which don't need to be mutable"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub COERCE_NEVER,
|
|
Deny,
|
|
"detect coercion to !"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub SINGLE_USE_LIFETIME,
|
|
Allow,
|
|
"detects single use lifetimes"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub TYVAR_BEHIND_RAW_POINTER,
|
|
Warn,
|
|
"raw pointer to an inference variable"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub ELIDED_LIFETIME_IN_PATH,
|
|
Allow,
|
|
"hidden lifetime parameters are deprecated, try `Foo<'_>`"
|
|
}
|
|
|
|
declare_lint! {
|
|
pub BARE_TRAIT_OBJECT,
|
|
Warn,
|
|
"suggest using `dyn Trait` for trait objects",
|
|
Epoch::Epoch2018
|
|
}
|
|
|
|
declare_lint! {
|
|
pub ILLEGAL_FLOATING_POINT_LITERAL_PATTERN,
|
|
Warn,
|
|
"floating-point literals cannot be used in patterns"
|
|
}
|
|
|
|
/// Does nothing as a lint pass, but registers some `Lint`s
|
|
/// which are used by other parts of the compiler.
|
|
#[derive(Copy, Clone)]
|
|
pub struct HardwiredLints;
|
|
|
|
impl LintPass for HardwiredLints {
|
|
fn get_lints(&self) -> LintArray {
|
|
lint_array!(
|
|
ILLEGAL_FLOATING_POINT_LITERAL_PATTERN,
|
|
EXCEEDING_BITSHIFTS,
|
|
UNUSED_IMPORTS,
|
|
UNUSED_EXTERN_CRATES,
|
|
UNUSED_QUALIFICATIONS,
|
|
UNKNOWN_LINTS,
|
|
UNUSED_VARIABLES,
|
|
UNUSED_ASSIGNMENTS,
|
|
DEAD_CODE,
|
|
UNREACHABLE_CODE,
|
|
UNREACHABLE_PATTERNS,
|
|
UNUSED_MACROS,
|
|
WARNINGS,
|
|
UNUSED_FEATURES,
|
|
STABLE_FEATURES,
|
|
UNKNOWN_CRATE_TYPES,
|
|
TRIVIAL_CASTS,
|
|
TRIVIAL_NUMERIC_CASTS,
|
|
PRIVATE_IN_PUBLIC,
|
|
PUB_USE_OF_PRIVATE_EXTERN_CRATE,
|
|
INVALID_TYPE_PARAM_DEFAULT,
|
|
CONST_ERR,
|
|
RENAMED_AND_REMOVED_LINTS,
|
|
RESOLVE_TRAIT_ON_DEFAULTED_UNIT,
|
|
SAFE_EXTERN_STATICS,
|
|
SAFE_PACKED_BORROWS,
|
|
PATTERNS_IN_FNS_WITHOUT_BODY,
|
|
LEGACY_DIRECTORY_OWNERSHIP,
|
|
LEGACY_IMPORTS,
|
|
LEGACY_CONSTRUCTOR_VISIBILITY,
|
|
MISSING_FRAGMENT_SPECIFIER,
|
|
PARENTHESIZED_PARAMS_IN_TYPES_AND_MODULES,
|
|
LATE_BOUND_LIFETIME_ARGUMENTS,
|
|
INCOHERENT_FUNDAMENTAL_IMPLS,
|
|
DEPRECATED,
|
|
UNUSED_UNSAFE,
|
|
UNUSED_MUT,
|
|
COERCE_NEVER,
|
|
SINGLE_USE_LIFETIME,
|
|
TYVAR_BEHIND_RAW_POINTER,
|
|
ELIDED_LIFETIME_IN_PATH,
|
|
BARE_TRAIT_OBJECT
|
|
)
|
|
}
|
|
}
|
|
|
|
// this could be a closure, but then implementing derive traits
|
|
// becomes hacky (and it gets allocated)
|
|
#[derive(PartialEq, RustcEncodable, RustcDecodable, Debug)]
|
|
pub enum BuiltinLintDiagnostics {
|
|
Normal,
|
|
BareTraitObject(Span, /* is_global */ bool)
|
|
}
|
|
|
|
impl BuiltinLintDiagnostics {
|
|
pub fn run(self, sess: &Session, db: &mut DiagnosticBuilder) {
|
|
match self {
|
|
BuiltinLintDiagnostics::Normal => (),
|
|
BuiltinLintDiagnostics::BareTraitObject(span, is_global) => {
|
|
let sugg = match sess.codemap().span_to_snippet(span) {
|
|
Ok(ref s) if is_global => format!("dyn ({})", s),
|
|
Ok(s) => format!("dyn {}", s),
|
|
Err(_) => format!("dyn <type>")
|
|
};
|
|
db.span_suggestion(span, "use `dyn`", sugg);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
impl<'a, 'tcx> LateLintPass<'a, 'tcx> for HardwiredLints {}
|