|
1 |
| -use crate::utils::{is_direct_expn_of, span_lint}; |
2 |
| -use if_chain::if_chain; |
| 1 | +use crate::utils::{higher, is_direct_expn_of, span_lint}; |
3 | 2 | use rustc_hir::intravisit::{walk_expr, NestedVisitorMap, Visitor};
|
4 |
| -use rustc_hir::{BorrowKind, Expr, ExprKind, MatchSource, Mutability, StmtKind, UnOp}; |
| 3 | +use rustc_hir::{BorrowKind, Expr, ExprKind, MatchSource, Mutability}; |
5 | 4 | use rustc_lint::{LateContext, LateLintPass};
|
6 | 5 | use rustc_middle::hir::map::Map;
|
7 | 6 | use rustc_middle::ty;
|
@@ -39,66 +38,23 @@ impl<'tcx> LateLintPass<'tcx> for DebugAssertWithMutCall {
|
39 | 38 | fn check_expr(&mut self, cx: &LateContext<'tcx>, e: &'tcx Expr<'_>) {
|
40 | 39 | for dmn in &DEBUG_MACRO_NAMES {
|
41 | 40 | if is_direct_expn_of(e.span, dmn).is_some() {
|
42 |
| - if let Some(span) = extract_call(cx, e) { |
43 |
| - span_lint( |
44 |
| - cx, |
45 |
| - DEBUG_ASSERT_WITH_MUT_CALL, |
46 |
| - span, |
47 |
| - &format!("do not call a function with mutable arguments inside of `{}!`", dmn), |
48 |
| - ); |
49 |
| - } |
50 |
| - } |
51 |
| - } |
52 |
| - } |
53 |
| -} |
54 |
| - |
55 |
| -//HACK(hellow554): remove this when #4694 is implemented |
56 |
| -fn extract_call<'tcx>(cx: &LateContext<'tcx>, e: &'tcx Expr<'_>) -> Option<Span> { |
57 |
| - if_chain! { |
58 |
| - if let ExprKind::Block(ref block, _) = e.kind; |
59 |
| - if block.stmts.len() == 1; |
60 |
| - if let StmtKind::Semi(ref matchexpr) = block.stmts[0].kind; |
61 |
| - then { |
62 |
| - // debug_assert |
63 |
| - if_chain! { |
64 |
| - if let ExprKind::Match(ref ifclause, _, _) = matchexpr.kind; |
65 |
| - if let ExprKind::DropTemps(ref droptmp) = ifclause.kind; |
66 |
| - if let ExprKind::Unary(UnOp::UnNot, ref condition) = droptmp.kind; |
67 |
| - then { |
68 |
| - let mut visitor = MutArgVisitor::new(cx); |
69 |
| - visitor.visit_expr(condition); |
70 |
| - return visitor.expr_span(); |
71 |
| - } |
72 |
| - } |
73 |
| - |
74 |
| - // debug_assert_{eq,ne} |
75 |
| - if_chain! { |
76 |
| - if let ExprKind::Block(ref matchblock, _) = matchexpr.kind; |
77 |
| - if let Some(ref matchheader) = matchblock.expr; |
78 |
| - if let ExprKind::Match(ref headerexpr, _, _) = matchheader.kind; |
79 |
| - if let ExprKind::Tup(ref conditions) = headerexpr.kind; |
80 |
| - if conditions.len() == 2; |
81 |
| - then { |
82 |
| - if let ExprKind::AddrOf(BorrowKind::Ref, _, ref lhs) = conditions[0].kind { |
| 41 | + if let Some(macro_args) = higher::extract_assert_macro_args(e) { |
| 42 | + for arg in macro_args { |
83 | 43 | let mut visitor = MutArgVisitor::new(cx);
|
84 |
| - visitor.visit_expr(lhs); |
| 44 | + visitor.visit_expr(arg); |
85 | 45 | if let Some(span) = visitor.expr_span() {
|
86 |
| - return Some(span); |
87 |
| - } |
88 |
| - } |
89 |
| - if let ExprKind::AddrOf(BorrowKind::Ref, _, ref rhs) = conditions[1].kind { |
90 |
| - let mut visitor = MutArgVisitor::new(cx); |
91 |
| - visitor.visit_expr(rhs); |
92 |
| - if let Some(span) = visitor.expr_span() { |
93 |
| - return Some(span); |
| 46 | + span_lint( |
| 47 | + cx, |
| 48 | + DEBUG_ASSERT_WITH_MUT_CALL, |
| 49 | + span, |
| 50 | + &format!("do not call a function with mutable arguments inside of `{}!`", dmn), |
| 51 | + ); |
94 | 52 | }
|
95 | 53 | }
|
96 | 54 | }
|
97 | 55 | }
|
98 | 56 | }
|
99 | 57 | }
|
100 |
| - |
101 |
| - None |
102 | 58 | }
|
103 | 59 |
|
104 | 60 | struct MutArgVisitor<'a, 'tcx> {
|
|
0 commit comments