mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-24 15:54:15 +00:00
Add check for assert_eq macros to unit_cmp lint
This commit is contained in:
parent
737f0a6bb5
commit
3557084b01
@ -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 {
|
||||
|
@ -20,4 +20,10 @@ fn main() {
|
||||
} > {
|
||||
false;
|
||||
} {}
|
||||
|
||||
assert_eq!((), ());
|
||||
debug_assert_eq!((), ());
|
||||
|
||||
assert_ne!((), ());
|
||||
debug_assert_ne!((), ());
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
@ -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());
|
||||
|
@ -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());
|
||||
|
@ -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 `()`
|
||||
|
Loading…
Reference in New Issue
Block a user