Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Don't trigger [debug_assert_with_mut_call] on debug_assert!(_.await) #5106

Merged
merged 4 commits into from
Jan 31, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions clippy_lints/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1261,7 +1261,6 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf:
LintId::of(&misc_early::ZERO_PREFIXED_LITERAL),
LintId::of(&mut_key::MUTABLE_KEY_TYPE),
LintId::of(&mut_reference::UNNECESSARY_MUT_PASSED),
LintId::of(&mutable_debug_assertion::DEBUG_ASSERT_WITH_MUT_CALL),
LintId::of(&mutex_atomic::MUTEX_ATOMIC),
LintId::of(&needless_bool::BOOL_COMPARISON),
LintId::of(&needless_bool::NEEDLESS_BOOL),
Expand Down Expand Up @@ -1578,7 +1577,6 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf:
LintId::of(&misc::FLOAT_CMP),
LintId::of(&misc::MODULO_ONE),
LintId::of(&mut_key::MUTABLE_KEY_TYPE),
LintId::of(&mutable_debug_assertion::DEBUG_ASSERT_WITH_MUT_CALL),
LintId::of(&non_copy_const::BORROW_INTERIOR_MUTABLE_CONST),
LintId::of(&non_copy_const::DECLARE_INTERIOR_MUTABLE_CONST),
LintId::of(&open_options::NONSENSICAL_OPEN_OPTIONS),
Expand Down Expand Up @@ -1632,6 +1630,7 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf:
LintId::of(&fallible_impl_from::FALLIBLE_IMPL_FROM),
LintId::of(&missing_const_for_fn::MISSING_CONST_FOR_FN),
LintId::of(&mul_add::MANUAL_MUL_ADD),
LintId::of(&mutable_debug_assertion::DEBUG_ASSERT_WITH_MUT_CALL),
LintId::of(&mutex_atomic::MUTEX_INTEGER),
LintId::of(&needless_borrow::NEEDLESS_BORROW),
LintId::of(&path_buf_push_overwrite::PATH_BUF_PUSH_OVERWRITE),
Expand Down
54 changes: 28 additions & 26 deletions clippy_lints/src/mutable_debug_assertion.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use matches::matches;
use rustc::hir::map::Map;
use rustc::ty;
use rustc_hir::intravisit::{walk_expr, NestedVisitorMap, Visitor};
use rustc_hir::{BorrowKind, Expr, ExprKind, Mutability, StmtKind, UnOp};
use rustc_hir::{BorrowKind, Expr, ExprKind, MatchSource, Mutability, StmtKind, UnOp};
use rustc_lint::{LateContext, LateLintPass};
use rustc_session::{declare_lint_pass, declare_tool_lint};
use rustc_span::Span;
Expand All @@ -28,7 +28,7 @@ declare_clippy_lint! {
/// debug_assert!(take_a_mut_parameter(&mut 5));
/// ```
pub DEBUG_ASSERT_WITH_MUT_CALL,
correctness,
nursery,
"mutable arguments in `debug_assert{,_ne,_eq}!`"
}

Expand Down Expand Up @@ -61,38 +61,38 @@ fn extract_call<'a, 'tcx>(cx: &'a LateContext<'a, 'tcx>, e: &'tcx Expr<'_>) -> O
if block.stmts.len() == 1;
if let StmtKind::Semi(ref matchexpr) = block.stmts[0].kind;
then {
// debug_assert
if_chain! {
if let ExprKind::Match(ref ifclause, _, _) = matchexpr.kind;
if let ExprKind::DropTemps(ref droptmp) = ifclause.kind;
if let ExprKind::Unary(UnOp::UnNot, ref condition) = droptmp.kind;
then {
// debug_assert
let mut visitor = MutArgVisitor::new(cx);
visitor.visit_expr(condition);
return visitor.expr_span();
} else {
// debug_assert_{eq,ne}
if_chain! {
if let ExprKind::Block(ref matchblock, _) = matchexpr.kind;
if let Some(ref matchheader) = matchblock.expr;
if let ExprKind::Match(ref headerexpr, _, _) = matchheader.kind;
if let ExprKind::Tup(ref conditions) = headerexpr.kind;
if conditions.len() == 2;
then {
if let ExprKind::AddrOf(BorrowKind::Ref, _, ref lhs) = conditions[0].kind {
let mut visitor = MutArgVisitor::new(cx);
visitor.visit_expr(lhs);
if let Some(span) = visitor.expr_span() {
return Some(span);
}
}
if let ExprKind::AddrOf(BorrowKind::Ref, _, ref rhs) = conditions[1].kind {
let mut visitor = MutArgVisitor::new(cx);
visitor.visit_expr(rhs);
if let Some(span) = visitor.expr_span() {
return Some(span);
}
}
}
}

// debug_assert_{eq,ne}
if_chain! {
if let ExprKind::Block(ref matchblock, _) = matchexpr.kind;
if let Some(ref matchheader) = matchblock.expr;
if let ExprKind::Match(ref headerexpr, _, _) = matchheader.kind;
if let ExprKind::Tup(ref conditions) = headerexpr.kind;
if conditions.len() == 2;
then {
if let ExprKind::AddrOf(BorrowKind::Ref, _, ref lhs) = conditions[0].kind {
let mut visitor = MutArgVisitor::new(cx);
visitor.visit_expr(lhs);
if let Some(span) = visitor.expr_span() {
return Some(span);
}
}
if let ExprKind::AddrOf(BorrowKind::Ref, _, ref rhs) = conditions[1].kind {
let mut visitor = MutArgVisitor::new(cx);
visitor.visit_expr(rhs);
if let Some(span) = visitor.expr_span() {
return Some(span);
}
}
}
Expand Down Expand Up @@ -147,6 +147,8 @@ impl<'a, 'tcx> Visitor<'tcx> for MutArgVisitor<'a, 'tcx> {
}
}
},
// Don't check await desugars
ExprKind::Match(_, _, MatchSource::AwaitDesugar) => return,
_ if !self.found => self.expr_span = Some(expr.span),
_ => return,
}
Expand Down
2 changes: 1 addition & 1 deletion src/lintlist/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -289,7 +289,7 @@ pub const ALL_LINTS: [Lint; 351] = [
},
Lint {
name: "debug_assert_with_mut_call",
group: "correctness",
group: "nursery",
desc: "mutable arguments in `debug_assert{,_ne,_eq}!`",
deprecation: None,
module: "mutable_debug_assertion",
Expand Down
9 changes: 9 additions & 0 deletions tests/ui/debug_assert_with_mut_call.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
// compile-flags: --edition=2018
#![feature(custom_inner_attributes)]
#![rustfmt::skip]
#![warn(clippy::debug_assert_with_mut_call)]
#![allow(clippy::trivially_copy_pass_by_ref, clippy::cognitive_complexity, clippy::redundant_closure_call)]

struct S;
Expand Down Expand Up @@ -114,11 +116,18 @@ fn misc() {
})());
}

async fn debug_await() {
debug_assert!(async {
true
}.await);
}

fn main() {
func_non_mutable();
func_mutable();
method_non_mutable();
method_mutable();

misc();
debug_await();
}
58 changes: 29 additions & 29 deletions tests/ui/debug_assert_with_mut_call.stderr
Original file line number Diff line number Diff line change
@@ -1,169 +1,169 @@
error: do not call a function with mutable arguments inside of `debug_assert!`
--> $DIR/debug_assert_with_mut_call.rs:40:19
--> $DIR/debug_assert_with_mut_call.rs:42:19
|
LL | debug_assert!(bool_mut(&mut 3));
| ^^^^^^^^^^^^^^^^
|
= note: `#[deny(clippy::debug_assert_with_mut_call)]` on by default
= note: `-D clippy::debug-assert-with-mut-call` implied by `-D warnings`

error: do not call a function with mutable arguments inside of `debug_assert!`
--> $DIR/debug_assert_with_mut_call.rs:41:20
--> $DIR/debug_assert_with_mut_call.rs:43:20
|
LL | debug_assert!(!bool_mut(&mut 3));
| ^^^^^^^^^^^^^^^^

error: do not call a function with mutable arguments inside of `debug_assert_eq!`
--> $DIR/debug_assert_with_mut_call.rs:43:25
--> $DIR/debug_assert_with_mut_call.rs:45:25
|
LL | debug_assert_eq!(0, u32_mut(&mut 3));
| ^^^^^^^^^^^^^^^

error: do not call a function with mutable arguments inside of `debug_assert_eq!`
--> $DIR/debug_assert_with_mut_call.rs:44:22
--> $DIR/debug_assert_with_mut_call.rs:46:22
|
LL | debug_assert_eq!(u32_mut(&mut 3), 0);
| ^^^^^^^^^^^^^^^

error: do not call a function with mutable arguments inside of `debug_assert_ne!`
--> $DIR/debug_assert_with_mut_call.rs:46:25
--> $DIR/debug_assert_with_mut_call.rs:48:25
|
LL | debug_assert_ne!(1, u32_mut(&mut 3));
| ^^^^^^^^^^^^^^^

error: do not call a function with mutable arguments inside of `debug_assert_ne!`
--> $DIR/debug_assert_with_mut_call.rs:47:22
--> $DIR/debug_assert_with_mut_call.rs:49:22
|
LL | debug_assert_ne!(u32_mut(&mut 3), 1);
| ^^^^^^^^^^^^^^^

error: do not call a function with mutable arguments inside of `debug_assert!`
--> $DIR/debug_assert_with_mut_call.rs:62:19
--> $DIR/debug_assert_with_mut_call.rs:64:19
|
LL | debug_assert!(S.bool_self_mut());
| ^^^^^^^^^^^^^^^^^

error: do not call a function with mutable arguments inside of `debug_assert!`
--> $DIR/debug_assert_with_mut_call.rs:63:20
--> $DIR/debug_assert_with_mut_call.rs:65:20
|
LL | debug_assert!(!S.bool_self_mut());
| ^^^^^^^^^^^^^^^^^

error: do not call a function with mutable arguments inside of `debug_assert!`
--> $DIR/debug_assert_with_mut_call.rs:64:19
--> $DIR/debug_assert_with_mut_call.rs:66:19
|
LL | debug_assert!(S.bool_self_ref_arg_mut(&mut 3));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: do not call a function with mutable arguments inside of `debug_assert!`
--> $DIR/debug_assert_with_mut_call.rs:65:19
--> $DIR/debug_assert_with_mut_call.rs:67:19
|
LL | debug_assert!(S.bool_self_mut_arg_ref(&3));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: do not call a function with mutable arguments inside of `debug_assert!`
--> $DIR/debug_assert_with_mut_call.rs:66:19
--> $DIR/debug_assert_with_mut_call.rs:68:19
|
LL | debug_assert!(S.bool_self_mut_arg_mut(&mut 3));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: do not call a function with mutable arguments inside of `debug_assert_eq!`
--> $DIR/debug_assert_with_mut_call.rs:68:22
--> $DIR/debug_assert_with_mut_call.rs:70:22
|
LL | debug_assert_eq!(S.u32_self_mut(), 0);
| ^^^^^^^^^^^^^^^^

error: do not call a function with mutable arguments inside of `debug_assert_eq!`
--> $DIR/debug_assert_with_mut_call.rs:69:22
--> $DIR/debug_assert_with_mut_call.rs:71:22
|
LL | debug_assert_eq!(S.u32_self_mut_arg_ref(&3), 0);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^

error: do not call a function with mutable arguments inside of `debug_assert_eq!`
--> $DIR/debug_assert_with_mut_call.rs:70:22
--> $DIR/debug_assert_with_mut_call.rs:72:22
|
LL | debug_assert_eq!(S.u32_self_ref_arg_mut(&mut 3), 0);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: do not call a function with mutable arguments inside of `debug_assert_eq!`
--> $DIR/debug_assert_with_mut_call.rs:71:22
--> $DIR/debug_assert_with_mut_call.rs:73:22
|
LL | debug_assert_eq!(S.u32_self_mut_arg_mut(&mut 3), 0);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: do not call a function with mutable arguments inside of `debug_assert_ne!`
--> $DIR/debug_assert_with_mut_call.rs:73:22
--> $DIR/debug_assert_with_mut_call.rs:75:22
|
LL | debug_assert_ne!(S.u32_self_mut(), 1);
| ^^^^^^^^^^^^^^^^

error: do not call a function with mutable arguments inside of `debug_assert_ne!`
--> $DIR/debug_assert_with_mut_call.rs:74:22
--> $DIR/debug_assert_with_mut_call.rs:76:22
|
LL | debug_assert_ne!(S.u32_self_mut_arg_ref(&3), 1);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^

error: do not call a function with mutable arguments inside of `debug_assert_ne!`
--> $DIR/debug_assert_with_mut_call.rs:75:22
--> $DIR/debug_assert_with_mut_call.rs:77:22
|
LL | debug_assert_ne!(S.u32_self_ref_arg_mut(&mut 3), 1);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: do not call a function with mutable arguments inside of `debug_assert_ne!`
--> $DIR/debug_assert_with_mut_call.rs:76:22
--> $DIR/debug_assert_with_mut_call.rs:78:22
|
LL | debug_assert_ne!(S.u32_self_mut_arg_mut(&mut 3), 1);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error: do not call a function with mutable arguments inside of `debug_assert_eq!`
--> $DIR/debug_assert_with_mut_call.rs:84:22
--> $DIR/debug_assert_with_mut_call.rs:86:22
|
LL | debug_assert_eq!(v.pop(), Some(1));
| ^^^^^^^

error: do not call a function with mutable arguments inside of `debug_assert_ne!`
--> $DIR/debug_assert_with_mut_call.rs:85:31
--> $DIR/debug_assert_with_mut_call.rs:87:31
|
LL | debug_assert_ne!(Some(3), v.pop());
| ^^^^^^^

error: do not call a function with mutable arguments inside of `debug_assert!`
--> $DIR/debug_assert_with_mut_call.rs:88:19
--> $DIR/debug_assert_with_mut_call.rs:90:19
|
LL | debug_assert!(bool_mut(a));
| ^^^^^^^^^^^

error: do not call a function with mutable arguments inside of `debug_assert!`
--> $DIR/debug_assert_with_mut_call.rs:91:31
--> $DIR/debug_assert_with_mut_call.rs:93:31
|
LL | debug_assert!(!(bool_ref(&u32_mut(&mut 3))));
| ^^^^^^^^^^^^^^^

error: do not call a function with mutable arguments inside of `debug_assert_eq!`
--> $DIR/debug_assert_with_mut_call.rs:94:22
--> $DIR/debug_assert_with_mut_call.rs:96:22
|
LL | debug_assert_eq!(v.pop().unwrap(), 3);
| ^^^^^^^

error: do not call a function with mutable arguments inside of `debug_assert!`
--> $DIR/debug_assert_with_mut_call.rs:98:19
--> $DIR/debug_assert_with_mut_call.rs:100:19
|
LL | debug_assert!(bool_mut(&mut 3), "w/o format");
| ^^^^^^^^^^^^^^^^

error: do not call a function with mutable arguments inside of `debug_assert!`
--> $DIR/debug_assert_with_mut_call.rs:100:19
--> $DIR/debug_assert_with_mut_call.rs:102:19
|
LL | debug_assert!(bool_mut(&mut 3), "{} format", "w/");
| ^^^^^^^^^^^^^^^^

error: do not call a function with mutable arguments inside of `debug_assert!`
--> $DIR/debug_assert_with_mut_call.rs:105:9
--> $DIR/debug_assert_with_mut_call.rs:107:9
|
LL | bool_mut(&mut x);
| ^^^^^^^^^^^^^^^^

error: do not call a function with mutable arguments inside of `debug_assert!`
--> $DIR/debug_assert_with_mut_call.rs:112:9
--> $DIR/debug_assert_with_mut_call.rs:114:9
|
LL | bool_mut(&mut x);
| ^^^^^^^^^^^^^^^^
Expand Down