mirror of
https://github.com/rust-lang/rust-clippy
synced 2024-11-27 15:11:30 +00:00
add lint for mutable borrow; may have false positives. pushed for feedback
This commit is contained in:
parent
2fe968774a
commit
d7867ef8c1
2 changed files with 27 additions and 5 deletions
|
@ -1327,7 +1327,20 @@ impl<'tcx> Delegate<'tcx> for MutateDelegate {
|
||||||
fn consume_pat(&mut self, _: &Pat, _: cmt<'tcx>, _: ConsumeMode) {
|
fn consume_pat(&mut self, _: &Pat, _: cmt<'tcx>, _: ConsumeMode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn borrow(&mut self, _: NodeId, _: Span, _: cmt<'tcx>, _: ty::Region, _: ty::BorrowKind, _: LoanCause) {
|
fn borrow(&mut self, _: NodeId, sp: Span, cmt: cmt<'tcx>, _: ty::Region, bk: ty::BorrowKind, _: LoanCause) {
|
||||||
|
match bk {
|
||||||
|
ty::BorrowKind::MutBorrow => {
|
||||||
|
if let Categorization::Local(id) = cmt.cat {
|
||||||
|
if Some(id) == self.node_id_low {
|
||||||
|
self.span_low = Some(sp)
|
||||||
|
}
|
||||||
|
if Some(id) == self.node_id_high {
|
||||||
|
self.span_high = Some(sp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_ => (),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn mutate(&mut self, _: NodeId, sp: Span, cmt: cmt<'tcx>, _: MutateMode) {
|
fn mutate(&mut self, _: NodeId, sp: Span, cmt: cmt<'tcx>, _: MutateMode) {
|
||||||
|
@ -1390,8 +1403,8 @@ fn check_for_mutability(cx: &LateContext, bound: &Expr) -> Option<NodeId> {
|
||||||
|
|
||||||
fn check_for_mutation(cx: &LateContext, body: &Expr, bound_ids: Vec<Option<NodeId>>) -> (Option<Span>, Option<Span>) {
|
fn check_for_mutation(cx: &LateContext, body: &Expr, bound_ids: Vec<Option<NodeId>>) -> (Option<Span>, Option<Span>) {
|
||||||
let mut delegate = MutateDelegate { node_id_low: bound_ids[0], node_id_high: bound_ids[1], span_low: None, span_high: None };
|
let mut delegate = MutateDelegate { node_id_low: bound_ids[0], node_id_high: bound_ids[1], span_low: None, span_high: None };
|
||||||
let d = def_id::DefId::local(body.hir_id.owner);
|
let def_id = def_id::DefId::local(body.hir_id.owner);
|
||||||
let region_scope_tree = &cx.tcx.region_scope_tree(d);
|
let region_scope_tree = &cx.tcx.region_scope_tree(def_id);
|
||||||
ExprUseVisitor::new(&mut delegate, cx.tcx, cx.param_env, region_scope_tree, cx.tables).walk_expr(body);
|
ExprUseVisitor::new(&mut delegate, cx.tcx, cx.param_env, region_scope_tree, cx.tables).walk_expr(body);
|
||||||
return delegate.mutation_span();
|
return delegate.mutation_span();
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,8 @@ fn main() {
|
||||||
mut_range_bound_both();
|
mut_range_bound_both();
|
||||||
mut_range_bound_no_mutation();
|
mut_range_bound_no_mutation();
|
||||||
immut_range_bound();
|
immut_range_bound();
|
||||||
|
mut_borrow_range_bound();
|
||||||
|
immut_borrow_range_bound();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn mut_range_bound_upper() {
|
fn mut_range_bound_upper() {
|
||||||
|
@ -35,8 +37,15 @@ fn mut_range_bound_no_mutation() {
|
||||||
fn mut_borrow_range_bound() {
|
fn mut_borrow_range_bound() {
|
||||||
let mut m = 4;
|
let mut m = 4;
|
||||||
for i in 0..m {
|
for i in 0..m {
|
||||||
let n = &mut m;
|
let n = &mut m; // warning here?
|
||||||
*n += 1;
|
*n += 1; // or here?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn immut_borrow_range_bound() {
|
||||||
|
let mut m = 4;
|
||||||
|
for i in 0..m {
|
||||||
|
let n = &m; // should be no warning?
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue