diff options
| author | bors <bors@rust-lang.org> | 2024-08-03 07:23:58 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-08-03 07:23:58 +0000 |
| commit | 1aa686b9c0fc0239110dcd00371d04666b14bdf7 (patch) | |
| tree | adce389d5a494f2d36a8f0b517992f39067719ea | |
| parent | 2fc74a39318e7786a0e335e6232dcf346c1a4df1 (diff) | |
| parent | 58027e265793d632597330ae2209c11b98bd9ed5 (diff) | |
| download | rust-1aa686b9c0fc0239110dcd00371d04666b14bdf7.tar.gz rust-1aa686b9c0fc0239110dcd00371d04666b14bdf7.zip | |
Auto merge of #13126 - apoisternex:issue12751, r=dswij
Fix [`redundant_slicing`] when the slice is behind a mutable reference Fixes #12751 changelog: Fix [`redundant_slicing`] when the slice is behind a mutable reference and a immutable reference is expected.
| -rw-r--r-- | clippy_lints/src/redundant_slicing.rs | 7 | ||||
| -rw-r--r-- | tests/ui/deref_by_slicing.fixed | 4 | ||||
| -rw-r--r-- | tests/ui/deref_by_slicing.rs | 4 | ||||
| -rw-r--r-- | tests/ui/deref_by_slicing.stderr | 8 |
4 files changed, 20 insertions, 3 deletions
diff --git a/clippy_lints/src/redundant_slicing.rs b/clippy_lints/src/redundant_slicing.rs index 82f22ad693d..7470ff754b5 100644 --- a/clippy_lints/src/redundant_slicing.rs +++ b/clippy_lints/src/redundant_slicing.rs @@ -113,8 +113,11 @@ impl<'tcx> LateLintPass<'tcx> for RedundantSlicing { a.kind, Adjust::Borrow(AutoBorrow::Ref(_, AutoBorrowMutability::Mut { .. })) ) - }) { - // The slice was used to make a temporary reference. + }) || (matches!( + cx.typeck_results().expr_ty(indexed).ref_mutability(), + Some(Mutability::Mut) + ) && mutability == Mutability::Not) + { (DEREF_BY_SLICING_LINT, "&*", "reborrow the original value instead") } else if deref_count != 0 { (DEREF_BY_SLICING_LINT, "", "dereference the original value instead") diff --git a/tests/ui/deref_by_slicing.fixed b/tests/ui/deref_by_slicing.fixed index a3c2e845666..87b33b1f881 100644 --- a/tests/ui/deref_by_slicing.fixed +++ b/tests/ui/deref_by_slicing.fixed @@ -25,4 +25,8 @@ fn main() { let bytes: &[u8] = &[]; let _ = (&*bytes).read_to_end(&mut vec![]).unwrap(); // Err, re-borrows slice + + // issue 12751 + let a = &mut [1, 2, 3][..]; + let _ = &*a; } diff --git a/tests/ui/deref_by_slicing.rs b/tests/ui/deref_by_slicing.rs index 5b4a73712ee..8d8882a1781 100644 --- a/tests/ui/deref_by_slicing.rs +++ b/tests/ui/deref_by_slicing.rs @@ -25,4 +25,8 @@ fn main() { let bytes: &[u8] = &[]; let _ = (&bytes[..]).read_to_end(&mut vec![]).unwrap(); // Err, re-borrows slice + + // issue 12751 + let a = &mut [1, 2, 3][..]; + let _ = &a[..]; } diff --git a/tests/ui/deref_by_slicing.stderr b/tests/ui/deref_by_slicing.stderr index 17b00610899..ceb9ab6db73 100644 --- a/tests/ui/deref_by_slicing.stderr +++ b/tests/ui/deref_by_slicing.stderr @@ -55,5 +55,11 @@ error: slicing when dereferencing would work LL | let _ = (&bytes[..]).read_to_end(&mut vec![]).unwrap(); // Err, re-borrows slice | ^^^^^^^^^^^^ help: reborrow the original value instead: `(&*bytes)` -error: aborting due to 9 previous errors +error: slicing when dereferencing would work + --> tests/ui/deref_by_slicing.rs:31:13 + | +LL | let _ = &a[..]; + | ^^^^^^ help: reborrow the original value instead: `&*a` + +error: aborting due to 10 previous errors |
