-
Notifications
You must be signed in to change notification settings - Fork 12.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Auto merge of #3582 - Arkweid:add-lints-aseert-checks, r=flip1995
Add assert(true) and assert(false) lints This PR add two lints on assert!(true) and assert!(false). #3575
- Loading branch information
Showing
12 changed files
with
154 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
use crate::consts::{constant, Constant}; | ||
use crate::rustc::hir::{Expr, ExprKind}; | ||
use crate::rustc::lint::{LateContext, LateLintPass, LintArray, LintPass}; | ||
use crate::rustc::{declare_tool_lint, lint_array}; | ||
use crate::syntax::ast::LitKind; | ||
use crate::utils::{is_direct_expn_of, span_help_and_lint}; | ||
use if_chain::if_chain; | ||
|
||
/// **What it does:** Check to call assert!(true/false) | ||
/// | ||
/// **Why is this bad?** Will be optimized out by the compiler or should probably be replaced by a | ||
/// panic!() or unreachable!() | ||
/// | ||
/// **Known problems:** None | ||
/// | ||
/// **Example:** | ||
/// ```rust | ||
/// assert!(false) | ||
/// // or | ||
/// assert!(true) | ||
/// // or | ||
/// const B: bool = false; | ||
/// assert!(B) | ||
/// ``` | ||
declare_clippy_lint! { | ||
pub ASSERTIONS_ON_CONSTANTS, | ||
style, | ||
"assert!(true/false) will be optimized out by the compiler/should probably be replaced by a panic!() or unreachable!()" | ||
} | ||
|
||
pub struct AssertionsOnConstants; | ||
|
||
impl LintPass for AssertionsOnConstants { | ||
fn get_lints(&self) -> LintArray { | ||
lint_array![ASSERTIONS_ON_CONSTANTS] | ||
} | ||
} | ||
|
||
impl<'a, 'tcx> LateLintPass<'a, 'tcx> for AssertionsOnConstants { | ||
fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, e: &'tcx Expr) { | ||
if_chain! { | ||
if is_direct_expn_of(e.span, "assert").is_some(); | ||
if let ExprKind::Unary(_, ref lit) = e.node; | ||
then { | ||
if let ExprKind::Lit(ref inner) = lit.node { | ||
match inner.node { | ||
LitKind::Bool(true) => { | ||
span_help_and_lint(cx, ASSERTIONS_ON_CONSTANTS, e.span, | ||
"assert!(true) will be optimized out by the compiler", | ||
"remove it"); | ||
}, | ||
LitKind::Bool(false) => { | ||
span_help_and_lint( | ||
cx, ASSERTIONS_ON_CONSTANTS, e.span, | ||
"assert!(false) should probably be replaced", | ||
"use panic!() or unreachable!()"); | ||
}, | ||
_ => (), | ||
} | ||
} else if let Some(bool_const) = constant(cx, cx.tables, lit) { | ||
match bool_const.0 { | ||
Constant::Bool(true) => { | ||
span_help_and_lint(cx, ASSERTIONS_ON_CONSTANTS, e.span, | ||
"assert!(const: true) will be optimized out by the compiler", | ||
"remove it"); | ||
}, | ||
Constant::Bool(false) => { | ||
span_help_and_lint(cx, ASSERTIONS_ON_CONSTANTS, e.span, | ||
"assert!(const: false) should probably be replaced", | ||
"use panic!() or unreachable!()"); | ||
}, | ||
_ => (), | ||
} | ||
} | ||
} | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,5 @@ | ||
#![allow(clippy::assertions_on_constants)] | ||
|
||
use std::fs::{self, DirEntry}; | ||
use std::path::Path; | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
fn main() { | ||
assert!(true); | ||
assert!(false); | ||
assert!(true, "true message"); | ||
assert!(false, "false message"); | ||
|
||
const B: bool = true; | ||
assert!(B); | ||
|
||
const C: bool = false; | ||
assert!(C); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
error: assert!(true) will be optimized out by the compiler | ||
--> $DIR/assertions_on_constants.rs:2:5 | ||
| | ||
LL | assert!(true); | ||
| ^^^^^^^^^^^^^^ | ||
| | ||
= note: `-D clippy::assertions-on-constants` implied by `-D warnings` | ||
= help: remove it | ||
|
||
error: assert!(false) should probably be replaced | ||
--> $DIR/assertions_on_constants.rs:3:5 | ||
| | ||
LL | assert!(false); | ||
| ^^^^^^^^^^^^^^^ | ||
| | ||
= help: use panic!() or unreachable!() | ||
|
||
error: assert!(true) will be optimized out by the compiler | ||
--> $DIR/assertions_on_constants.rs:4:5 | ||
| | ||
LL | assert!(true, "true message"); | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
| | ||
= help: remove it | ||
|
||
error: assert!(false) should probably be replaced | ||
--> $DIR/assertions_on_constants.rs:5:5 | ||
| | ||
LL | assert!(false, "false message"); | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
| | ||
= help: use panic!() or unreachable!() | ||
|
||
error: assert!(const: true) will be optimized out by the compiler | ||
--> $DIR/assertions_on_constants.rs:8:5 | ||
| | ||
LL | assert!(B); | ||
| ^^^^^^^^^^^ | ||
| | ||
= help: remove it | ||
|
||
error: assert!(const: false) should probably be replaced | ||
--> $DIR/assertions_on_constants.rs:11:5 | ||
| | ||
LL | assert!(C); | ||
| ^^^^^^^^^^^ | ||
| | ||
= help: use panic!() or unreachable!() | ||
|
||
error: aborting due to 6 previous errors | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters