Add check for assert_eq macros to unit_cmp lint

This commit is contained in:
Matthias Seiffert 2019-10-02 22:48:19 +02:00
parent 737f0a6bb5
commit 3557084b01
6 changed files with 69 additions and 3 deletions

View file

@ -17,6 +17,8 @@ use rustc_target::spec::abi::Abi;
use rustc_typeck::hir_ty_to_ty;
use syntax::ast::{FloatTy, IntTy, LitIntType, LitKind, UintTy};
use syntax::errors::DiagnosticBuilder;
use syntax::ext::base::MacroKind;
use syntax::ext::hygiene::ExpnKind;
use syntax::source_map::Span;
use syntax::symbol::{sym, Symbol};
@ -527,6 +529,30 @@ declare_lint_pass!(UnitCmp => [UNIT_CMP]);
impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnitCmp {
fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr) {
if expr.span.from_expansion() {
if let Some(callee) = expr.span.source_callee() {
if let ExpnKind::Macro(MacroKind::Bang, symbol) = callee.kind {
if let ExprKind::Binary(ref cmp, ref left, _) = expr.kind {
let op = cmp.node;
if op.is_comparison() && is_unit(cx.tables.expr_ty(left)) {
let result = match &*symbol.as_str() {
"assert_eq" | "debug_assert_eq" => "succeed",
"assert_ne" | "debug_assert_ne" => "fail",
_ => return,
};
span_lint(
cx,
UNIT_CMP,
expr.span,
&format!(
"{} of unit values detected. This will always {}",
symbol.as_str(),
result
),
);
}
}
}
}
return;
}
if let ExprKind::Binary(ref cmp, ref left, _) = expr.kind {

View file

@ -20,4 +20,10 @@ fn main() {
} > {
false;
} {}
assert_eq!((), ());
debug_assert_eq!((), ());
assert_ne!((), ());
debug_assert_ne!((), ());
}

View file

@ -22,5 +22,37 @@ LL | | false;
LL | | } {}
| |_____^
error: aborting due to 2 previous errors
error: assert_eq of unit values detected. This will always succeed
--> $DIR/unit_cmp.rs:24:5
|
LL | assert_eq!((), ());
| ^^^^^^^^^^^^^^^^^^^
|
= note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
error: debug_assert_eq of unit values detected. This will always succeed
--> $DIR/unit_cmp.rs:25:5
|
LL | debug_assert_eq!((), ());
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
error: assert_ne of unit values detected. This will always fail
--> $DIR/unit_cmp.rs:27:5
|
LL | assert_ne!((), ());
| ^^^^^^^^^^^^^^^^^^^
|
= note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
error: debug_assert_ne of unit values detected. This will always fail
--> $DIR/unit_cmp.rs:28:5
|
LL | debug_assert_ne!((), ());
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
error: aborting due to 6 previous errors

View file

@ -34,6 +34,7 @@ fn return_unit() { }
#[allow(clippy::needless_return)]
#[allow(clippy::never_loop)]
#[allow(clippy::unit_cmp)]
fn main() {
let u = Unitter;
assert_eq!(u.get_unit(|| {}, return_unit), u.into());

View file

@ -35,6 +35,7 @@ fn return_unit() -> () { () }
#[allow(clippy::needless_return)]
#[allow(clippy::never_loop)]
#[allow(clippy::unit_cmp)]
fn main() {
let u = Unitter;
assert_eq!(u.get_unit(|| {}, return_unit), u.into());

View file

@ -37,13 +37,13 @@ LL | fn return_unit() -> () { () }
| ^^ help: remove the final `()`
error: unneeded `()`
--> $DIR/unused_unit.rs:43:14
--> $DIR/unused_unit.rs:44:14
|
LL | break();
| ^^ help: remove the `()`
error: unneeded `()`
--> $DIR/unused_unit.rs:45:11
--> $DIR/unused_unit.rs:46:11
|
LL | return();
| ^^ help: remove the `()`