Fix FP in external macros for mut_mut lint

This commit is contained in:
ThibsG
2021-10-09 15:54:16 +02:00
parent 22144c02c2
commit 1e18b8a269
4 changed files with 30 additions and 9 deletions

View File

@@ -82,6 +82,10 @@ impl<'a, 'tcx> intravisit::Visitor<'tcx> for MutVisitor<'a, 'tcx> {
} }
fn visit_ty(&mut self, ty: &'tcx hir::Ty<'_>) { fn visit_ty(&mut self, ty: &'tcx hir::Ty<'_>) {
if in_external_macro(self.cx.sess(), ty.span) {
return;
}
if let hir::TyKind::Rptr( if let hir::TyKind::Rptr(
_, _,
hir::MutTy { hir::MutTy {

View File

@@ -113,3 +113,10 @@ macro_rules! default_numeric_fallback {
let x = 22; let x = 22;
}; };
} }
#[macro_export]
macro_rules! mut_mut {
() => {
let mut_mut_ty: &mut &mut u32 = &mut &mut 1u32;
};
}

View File

@@ -1,6 +1,11 @@
// aux-build:macro_rules.rs
#![allow(unused, clippy::no_effect, clippy::unnecessary_operation)] #![allow(unused, clippy::no_effect, clippy::unnecessary_operation)]
#![warn(clippy::mut_mut)] #![warn(clippy::mut_mut)]
#[macro_use]
extern crate macro_rules;
fn fun(x: &mut &mut u32) -> bool { fn fun(x: &mut &mut u32) -> bool {
**x > 0 **x > 0
} }
@@ -47,3 +52,8 @@ fn issue939() {
println!(":{}", arg); println!(":{}", arg);
} }
} }
fn issue6922() {
// do not lint from an external macro
mut_mut!();
}

View File

@@ -1,5 +1,5 @@
error: generally you want to avoid `&mut &mut _` if possible error: generally you want to avoid `&mut &mut _` if possible
--> $DIR/mut_mut.rs:4:11 --> $DIR/mut_mut.rs:9:11
| |
LL | fn fun(x: &mut &mut u32) -> bool { LL | fn fun(x: &mut &mut u32) -> bool {
| ^^^^^^^^^^^^^ | ^^^^^^^^^^^^^
@@ -7,13 +7,13 @@ LL | fn fun(x: &mut &mut u32) -> bool {
= note: `-D clippy::mut-mut` implied by `-D warnings` = note: `-D clippy::mut-mut` implied by `-D warnings`
error: generally you want to avoid `&mut &mut _` if possible error: generally you want to avoid `&mut &mut _` if possible
--> $DIR/mut_mut.rs:20:17 --> $DIR/mut_mut.rs:25:17
| |
LL | let mut x = &mut &mut 1u32; LL | let mut x = &mut &mut 1u32;
| ^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^
error: generally you want to avoid `&mut &mut _` if possible error: generally you want to avoid `&mut &mut _` if possible
--> $DIR/mut_mut.rs:14:9 --> $DIR/mut_mut.rs:19:9
| |
LL | &mut $p LL | &mut $p
| ^^^^^^^ | ^^^^^^^
@@ -24,37 +24,37 @@ LL | let mut z = mut_ptr!(&mut 3u32);
= note: this error originates in the macro `mut_ptr` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the macro `mut_ptr` (in Nightly builds, run with -Z macro-backtrace for more info)
error: this expression mutably borrows a mutable reference. Consider reborrowing error: this expression mutably borrows a mutable reference. Consider reborrowing
--> $DIR/mut_mut.rs:22:21 --> $DIR/mut_mut.rs:27:21
| |
LL | let mut y = &mut x; LL | let mut y = &mut x;
| ^^^^^^ | ^^^^^^
error: generally you want to avoid `&mut &mut _` if possible error: generally you want to avoid `&mut &mut _` if possible
--> $DIR/mut_mut.rs:26:32 --> $DIR/mut_mut.rs:31:32
| |
LL | let y: &mut &mut u32 = &mut &mut 2; LL | let y: &mut &mut u32 = &mut &mut 2;
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error: generally you want to avoid `&mut &mut _` if possible error: generally you want to avoid `&mut &mut _` if possible
--> $DIR/mut_mut.rs:26:16 --> $DIR/mut_mut.rs:31:16
| |
LL | let y: &mut &mut u32 = &mut &mut 2; LL | let y: &mut &mut u32 = &mut &mut 2;
| ^^^^^^^^^^^^^ | ^^^^^^^^^^^^^
error: generally you want to avoid `&mut &mut _` if possible error: generally you want to avoid `&mut &mut _` if possible
--> $DIR/mut_mut.rs:31:37 --> $DIR/mut_mut.rs:36:37
| |
LL | let y: &mut &mut &mut u32 = &mut &mut &mut 2; LL | let y: &mut &mut &mut u32 = &mut &mut &mut 2;
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
error: generally you want to avoid `&mut &mut _` if possible error: generally you want to avoid `&mut &mut _` if possible
--> $DIR/mut_mut.rs:31:16 --> $DIR/mut_mut.rs:36:16
| |
LL | let y: &mut &mut &mut u32 = &mut &mut &mut 2; LL | let y: &mut &mut &mut u32 = &mut &mut &mut 2;
| ^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^
error: generally you want to avoid `&mut &mut _` if possible error: generally you want to avoid `&mut &mut _` if possible
--> $DIR/mut_mut.rs:31:21 --> $DIR/mut_mut.rs:36:21
| |
LL | let y: &mut &mut &mut u32 = &mut &mut &mut 2; LL | let y: &mut &mut &mut u32 = &mut &mut &mut 2;
| ^^^^^^^^^^^^^ | ^^^^^^^^^^^^^