Skip to content

Commit

Permalink
Auto merge of rust-lang#5106 - flip1995:dbg_assert_mut_async, r=oli-obk
Browse files Browse the repository at this point in the history
Don't trigger [debug_assert_with_mut_call] on debug_assert!(_.await)

Fixes rust-lang#5105

cc rust-lang#5112

changelog: Don't trigger [`debug_assert_with_mut_call`] on `debug_assert!(_.await)` and move it to nursery.
  • Loading branch information
bors committed Jan 31, 2020
2 parents b901012 + 5ba4aa8 commit 5826a04
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 58 deletions.
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

0 comments on commit 5826a04

Please sign in to comment.