//! If you define a new `LateLintPass`, you will also need to add it to the
//! `late_lint_methods!` invocation in `lib.rs`.
-use std::fmt::Write;
-
-use lint::{EarlyContext, EarlyLintPass, LateLintPass, LintPass};
-use lint::{LateContext, LintArray, LintContext};
+use crate::{EarlyContext, EarlyLintPass, LateContext, LateLintPass, LintContext};
use rustc::hir::map::Map;
-use rustc::lint;
-use rustc::lint::FutureIncompatibleInfo;
use rustc::traits::misc::can_type_implement_copy;
use rustc::ty::{self, layout::VariantIdx, Ty, TyCtxt};
use rustc_data_structures::fx::FxHashSet;
use rustc_hir::def_id::DefId;
use rustc_hir::{GenericParamKind, PatKind};
use rustc_hir::{HirIdSet, Node};
+use rustc_session::lint::FutureIncompatibleInfo;
use rustc_span::edition::Edition;
use rustc_span::source_map::Spanned;
use rustc_span::symbol::{kw, sym, Symbol};
use crate::nonstandard_style::{method_context, MethodLateContext};
use log::debug;
+use std::fmt::Write;
// hardwired lints from librustc
-pub use lint::builtin::*;
+pub use rustc_session::lint::builtin::*;
declare_lint! {
WHILE_TRUE,
)
.span_suggestion(
arg.pat.span,
- "Try naming the parameter or explicitly \
+ "try naming the parameter or explicitly \
ignoring it",
format!("_: {}", ty_snip),
appl,
}
declare_lint_pass!(
- /// Check for used feature gates in `INCOMPLETE_FEATURES` in `feature_gate.rs`.
+ /// Check for used feature gates in `INCOMPLETE_FEATURES` in `librustc_feature/active.rs`.
IncompleteFeatures => [INCOMPLETE_FEATURES]
);
use rustc::ty::TyKind::*;
match ty.kind {
// Primitive types that don't like 0 as a value.
- Ref(..) => Some((format!("References must be non-null"), None)),
+ Ref(..) => Some((format!("references must be non-null"), None)),
Adt(..) if ty.is_box() => Some((format!("`Box` must be non-null"), None)),
- FnPtr(..) => Some((format!("Function pointers must be non-null"), None)),
- Never => Some((format!("The never type (`!`) has no valid value"), None)),
+ FnPtr(..) => Some((format!("function pointers must be non-null"), None)),
+ Never => Some((format!("the `!` type has no valid value"), None)),
RawPtr(tm) if matches!(tm.ty.kind, Dynamic(..)) =>
// raw ptr to dyn Trait
{
- Some((format!("The vtable of a wide raw pointer must be non-null"), None))
+ Some((format!("the vtable of a wide raw pointer must be non-null"), None))
}
// Primitive types with other constraints.
Bool if init == InitKind::Uninit => {
- Some((format!("Booleans must be `true` or `false`"), None))
+ Some((format!("booleans must be either `true` or `false`"), None))
}
Char if init == InitKind::Uninit => {
- Some((format!("Characters must be a valid unicode codepoint"), None))
+ Some((format!("characters must be a valid Unicode codepoint"), None))
}
// Recurse and checks for some compound types.
Adt(adt_def, substs) if !adt_def.is_union() => {
// return `Bound::Excluded`. (And we have tests checking that we
// handle the attribute correctly.)
(Bound::Included(lo), _) if lo > 0 => {
- return Some((format!("{} must be non-null", ty), None));
+ return Some((format!("`{}` must be non-null", ty), None));
}
(Bound::Included(_), _) | (_, Bound::Included(_))
if init == InitKind::Uninit =>
{
return Some((
- format!("{} must be initialized inside its custom valid range", ty),
+ format!(
+ "`{}` must be initialized inside its custom valid range",
+ ty,
+ ),
None,
));
}
}
// Now, recurse.
match adt_def.variants.len() {
- 0 => Some((format!("0-variant enums have no valid value"), None)),
+ 0 => Some((format!("enums with no variants have no valid value"), None)),
1 => {
// Struct, or enum with exactly one variant.
// Proceed recursively, check all fields.