Skip to content

Commit 32b2779

Browse files
committed
Auto merge of #124902 - compiler-errors:mem-cat-but-better, r=lcnr
Fix MemCategorization and ExprUse visitors for new solver (this time it's better) Best reviewed by each commit. Supersedes #124859. r? lcnr
2 parents 910688a + 8fa179a commit 32b2779

File tree

11 files changed

+33
-68
lines changed

11 files changed

+33
-68
lines changed

clippy_lints/src/escape.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use clippy_utils::diagnostics::span_lint_hir;
22
use rustc_hir::{intravisit, AssocItemKind, Body, FnDecl, HirId, HirIdSet, Impl, ItemKind, Node, Pat, PatKind};
33
use rustc_hir_typeck::expr_use_visitor::{Delegate, ExprUseVisitor, PlaceBase, PlaceWithHirId};
4-
use rustc_infer::infer::TyCtxtInferExt;
54
use rustc_lint::{LateContext, LateLintPass};
65
use rustc_middle::mir::FakeReadCause;
76
use rustc_middle::ty::layout::LayoutOf;
@@ -105,8 +104,7 @@ impl<'tcx> LateLintPass<'tcx> for BoxedLocal {
105104
too_large_for_stack: self.too_large_for_stack,
106105
};
107106

108-
let infcx = cx.tcx.infer_ctxt().build();
109-
ExprUseVisitor::new(&mut v, &infcx, fn_def_id, cx.param_env, cx.typeck_results()).consume_body(body);
107+
ExprUseVisitor::for_clippy(cx, fn_def_id, &mut v).consume_body(body).into_ok();
110108

111109
for node in v.set {
112110
span_lint_hir(

clippy_lints/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#![feature(never_type)]
99
#![feature(rustc_private)]
1010
#![feature(stmt_expr_attributes)]
11+
#![feature(unwrap_infallible)]
1112
#![recursion_limit = "512"]
1213
#![cfg_attr(feature = "deny-warnings", deny(warnings))]
1314
#![allow(

clippy_lints/src/loops/mut_range_bound.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ use clippy_utils::{get_enclosing_block, higher, path_to_local};
44
use rustc_hir::intravisit::{self, Visitor};
55
use rustc_hir::{BindingMode, Expr, ExprKind, HirId, Node, PatKind};
66
use rustc_hir_typeck::expr_use_visitor::{Delegate, ExprUseVisitor, PlaceBase, PlaceWithHirId};
7-
use rustc_infer::infer::TyCtxtInferExt;
87
use rustc_lint::LateContext;
98
use rustc_middle::mir::FakeReadCause;
109
use rustc_middle::ty;
@@ -61,15 +60,12 @@ fn check_for_mutation(
6160
span_low: None,
6261
span_high: None,
6362
};
64-
let infcx = cx.tcx.infer_ctxt().build();
65-
ExprUseVisitor::new(
66-
&mut delegate,
67-
&infcx,
63+
ExprUseVisitor::for_clippy(
64+
cx,
6865
body.hir_id.owner.def_id,
69-
cx.param_env,
70-
cx.typeck_results(),
66+
&mut delegate,
7167
)
72-
.walk_expr(body);
68+
.walk_expr(body).into_ok();
7369

7470
delegate.mutation_span()
7571
}

clippy_lints/src/methods/iter_overeager_cloned.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ use rustc_lint::LateContext;
99
use rustc_middle::mir::{FakeReadCause, Mutability};
1010
use rustc_middle::ty::{self, BorrowKind};
1111
use rustc_span::sym;
12-
use rustc_trait_selection::infer::TyCtxtInferExt;
1312

1413
use super::ITER_OVEREAGER_CLONED;
1514
use crate::redundant_clone::REDUNDANT_CLONE;
@@ -69,16 +68,13 @@ pub(super) fn check<'tcx>(
6968
let mut delegate = MoveDelegate {
7069
used_move: HirIdSet::default(),
7170
};
72-
let infcx = cx.tcx.infer_ctxt().build();
7371

74-
ExprUseVisitor::new(
72+
ExprUseVisitor::for_clippy(
73+
cx,
74+
closure.def_id,
7575
&mut delegate,
76-
&infcx,
77-
closure.body.hir_id.owner.def_id,
78-
cx.param_env,
79-
cx.typeck_results(),
8076
)
81-
.consume_body(body);
77+
.consume_body(body).into_ok();
8278

8379
let mut to_be_discarded = false;
8480

clippy_lints/src/needless_pass_by_ref_mut.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ use rustc_hir::{
1111
PatKind,
1212
};
1313
use rustc_hir_typeck::expr_use_visitor as euv;
14-
use rustc_infer::infer::{InferCtxt, TyCtxtInferExt};
1514
use rustc_lint::{LateContext, LateLintPass};
1615
use rustc_middle::mir::FakeReadCause;
1716
use rustc_middle::ty::{self, Ty, TyCtxt, UpvarId, UpvarPath};
@@ -102,7 +101,6 @@ fn should_skip<'tcx>(
102101
fn check_closures<'tcx>(
103102
ctx: &mut MutablyUsedVariablesCtxt<'tcx>,
104103
cx: &LateContext<'tcx>,
105-
infcx: &InferCtxt<'tcx>,
106104
checked_closures: &mut FxHashSet<LocalDefId>,
107105
closures: FxHashSet<LocalDefId>,
108106
) {
@@ -119,7 +117,7 @@ fn check_closures<'tcx>(
119117
.associated_body()
120118
.map(|(_, body_id)| hir.body(body_id))
121119
{
122-
euv::ExprUseVisitor::new(ctx, infcx, closure, cx.param_env, cx.typeck_results()).consume_body(body);
120+
euv::ExprUseVisitor::for_clippy(cx, closure, &mut *ctx).consume_body(body).into_ok();
123121
}
124122
}
125123
}
@@ -196,8 +194,7 @@ impl<'tcx> LateLintPass<'tcx> for NeedlessPassByRefMut<'tcx> {
196194
async_closures: FxHashSet::default(),
197195
tcx: cx.tcx,
198196
};
199-
let infcx = cx.tcx.infer_ctxt().build();
200-
euv::ExprUseVisitor::new(&mut ctx, &infcx, fn_def_id, cx.param_env, cx.typeck_results()).consume_body(body);
197+
euv::ExprUseVisitor::for_clippy(cx, fn_def_id, &mut ctx).consume_body(body).into_ok();
201198

202199
let mut checked_closures = FxHashSet::default();
203200

@@ -210,13 +207,13 @@ impl<'tcx> LateLintPass<'tcx> for NeedlessPassByRefMut<'tcx> {
210207
}
211208
ControlFlow::<()>::Continue(())
212209
});
213-
check_closures(&mut ctx, cx, &infcx, &mut checked_closures, closures);
210+
check_closures(&mut ctx, cx, &mut checked_closures, closures);
214211

215212
if is_async {
216213
while !ctx.async_closures.is_empty() {
217214
let async_closures = ctx.async_closures.clone();
218215
ctx.async_closures.clear();
219-
check_closures(&mut ctx, cx, &infcx, &mut checked_closures, async_closures);
216+
check_closures(&mut ctx, cx, &mut checked_closures, async_closures);
220217
}
221218
}
222219
ctx.generate_mutably_used_ids_from_aliases()

clippy_lints/src/needless_pass_by_value.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ use rustc_hir::{
1313
TyKind,
1414
};
1515
use rustc_hir_typeck::expr_use_visitor as euv;
16-
use rustc_infer::infer::TyCtxtInferExt;
1716
use rustc_lint::{LateContext, LateLintPass};
1817
use rustc_middle::mir::FakeReadCause;
1918
use rustc_middle::ty::{self, Ty, TypeVisitableExt};
@@ -134,8 +133,7 @@ impl<'tcx> LateLintPass<'tcx> for NeedlessPassByValue {
134133
// function body.
135134
let MovedVariablesCtxt { moved_vars } = {
136135
let mut ctx = MovedVariablesCtxt::default();
137-
let infcx = cx.tcx.infer_ctxt().build();
138-
euv::ExprUseVisitor::new(&mut ctx, &infcx, fn_def_id, cx.param_env, cx.typeck_results()).consume_body(body);
136+
euv::ExprUseVisitor::for_clippy(cx, fn_def_id, &mut ctx).consume_body(body).into_ok();
139137
ctx
140138
};
141139

clippy_lints/src/operators/assign_op_pattern.rs

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ use rustc_hir_typeck::expr_use_visitor::{Delegate, ExprUseVisitor, PlaceBase, Pl
1111
use rustc_lint::LateContext;
1212
use rustc_middle::mir::FakeReadCause;
1313
use rustc_middle::ty::BorrowKind;
14-
use rustc_trait_selection::infer::TyCtxtInferExt;
1514

1615
use super::ASSIGN_OP_PATTERN;
1716

@@ -119,15 +118,8 @@ fn imm_borrows_in_expr(cx: &LateContext<'_>, e: &hir::Expr<'_>) -> HirIdSet {
119118
}
120119

121120
let mut s = S(HirIdSet::default());
122-
let infcx = cx.tcx.infer_ctxt().build();
123-
let mut v = ExprUseVisitor::new(
124-
&mut s,
125-
&infcx,
126-
cx.tcx.hir().body_owner_def_id(cx.enclosing_body.unwrap()),
127-
cx.param_env,
128-
cx.typeck_results(),
129-
);
130-
v.consume_expr(e);
121+
let v = ExprUseVisitor::for_clippy(cx, e.hir_id.owner.def_id, &mut s);
122+
v.consume_expr(e).into_ok();
131123
s.0
132124
}
133125

@@ -151,14 +143,7 @@ fn mut_borrows_in_expr(cx: &LateContext<'_>, e: &hir::Expr<'_>) -> HirIdSet {
151143
}
152144

153145
let mut s = S(HirIdSet::default());
154-
let infcx = cx.tcx.infer_ctxt().build();
155-
let mut v = ExprUseVisitor::new(
156-
&mut s,
157-
&infcx,
158-
cx.tcx.hir().body_owner_def_id(cx.enclosing_body.unwrap()),
159-
cx.param_env,
160-
cx.typeck_results(),
161-
);
162-
v.consume_expr(e);
146+
let v = ExprUseVisitor::for_clippy(cx, e.hir_id.owner.def_id, &mut s);
147+
v.consume_expr(e).into_ok();
163148
s.0
164149
}

clippy_lints/src/unwrap.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ use rustc_errors::Applicability;
66
use rustc_hir::intravisit::{walk_expr, walk_fn, FnKind, Visitor};
77
use rustc_hir::{BinOpKind, Body, Expr, ExprKind, FnDecl, HirId, Node, PathSegment, UnOp};
88
use rustc_hir_typeck::expr_use_visitor::{Delegate, ExprUseVisitor, PlaceWithHirId};
9-
use rustc_infer::infer::TyCtxtInferExt;
109
use rustc_lint::{LateContext, LateLintPass};
1110
use rustc_middle::hir::nested_filter;
1211
use rustc_middle::lint::in_external_macro;
@@ -252,16 +251,13 @@ impl<'a, 'tcx> UnwrappableVariablesVisitor<'a, 'tcx> {
252251
local_id: unwrap_info.local_id,
253252
};
254253

255-
let infcx = self.cx.tcx.infer_ctxt().build();
256-
let mut vis = ExprUseVisitor::new(
257-
&mut delegate,
258-
&infcx,
254+
let vis = ExprUseVisitor::for_clippy(
255+
self.cx,
259256
cond.hir_id.owner.def_id,
260-
self.cx.param_env,
261-
self.cx.typeck_results(),
257+
&mut delegate,
262258
);
263-
vis.walk_expr(cond);
264-
vis.walk_expr(branch);
259+
vis.walk_expr(cond).into_ok();
260+
vis.walk_expr(branch).into_ok();
265261

266262
if delegate.is_mutated {
267263
// if the variable is mutated, we don't know whether it can be unwrapped.

clippy_utils/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#![feature(never_type)]
88
#![feature(rustc_private)]
99
#![feature(assert_matches)]
10+
#![feature(unwrap_infallible)]
1011
#![recursion_limit = "512"]
1112
#![cfg_attr(feature = "deny-warnings", deny(warnings))]
1213
#![allow(

clippy_utils/src/sugg.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ use rustc_errors::Applicability;
1111
use rustc_hir as hir;
1212
use rustc_hir::{Closure, ExprKind, HirId, MutTy, TyKind};
1313
use rustc_hir_typeck::expr_use_visitor::{Delegate, ExprUseVisitor, PlaceBase, PlaceWithHirId};
14-
use rustc_infer::infer::TyCtxtInferExt;
1514
use rustc_lint::{EarlyContext, LateContext, LintContext};
1615
use rustc_middle::hir::place::ProjectionKind;
1716
use rustc_middle::mir::{FakeReadCause, Mutability};
@@ -831,8 +830,9 @@ pub fn deref_closure_args(cx: &LateContext<'_>, closure: &hir::Expr<'_>) -> Opti
831830
applicability: Applicability::MachineApplicable,
832831
};
833832

834-
let infcx = cx.tcx.infer_ctxt().build();
835-
ExprUseVisitor::new(&mut visitor, &infcx, def_id, cx.param_env, cx.typeck_results()).consume_body(closure_body);
833+
ExprUseVisitor::for_clippy(cx, def_id, &mut visitor)
834+
.consume_body(closure_body)
835+
.into_ok();
836836

837837
if !visitor.suggestion_start.is_empty() {
838838
return Some(DerefClosure {

0 commit comments

Comments
 (0)