Commit Graph

8018 Commits

Author SHA1 Message Date
lapla-cogito 90dbc5bf94 make never_loop applicability more flexible 2025-03-10 15:00:57 +09:00
Philipp Krones 238edf273d Rustup (#14262)
r? @ghost

changelog: none
2025-02-20 14:59:15 +00:00
Philipp Krones e6be02eaf5 Rustup: fix 32bit tests 2025-02-20 15:54:12 +01:00
Philipp Krones 12025085b9 Merge remote-tracking branch 'upstream/master' into rustup 2025-02-20 15:26:07 +01:00
Andre Bogus 83f5cbad18 add owned_cow lint 2025-02-19 23:12:46 +01:00
Catherine Flores d8ecde0e43 fix: map_entry FP on struct member (#14151)
fixes #13934

I modified the part for checking if the map is used so that it can check
field and index exprs.

changelog: [`map_entry`]: fix FP on struct member
2025-02-19 09:07:34 +00:00
Catherine Flores 975a813c5a .last() to .next_back() requires a mutable receiver (#14140)
In the case where `iter` is a `DoubleEndedIterator`, replacing a call to
`iter.last()` (which consumes `iter`) by `iter.next_back()` (which
requires a mutable reference to `iter`) cannot be done when `iter` is a
non-mutable binding which is not a mutable reference. When possible, a
local immutable binding is made into a mutable one.

Also, the applicability is switched to `MaybeIncorrect` and a note is
added to the output when the element types have a significant drop,
because the drop order will potentially be modified because
`.next_back()` does not consume the iterator nor the elements before the
last one.

Fix #14139

changelog: [`double_ended_iterator_last`]: do not trigger on
non-reference immutable receiver, and warn about possible drop order
change
2025-02-19 09:05:46 +00:00
Samuel Tardieu dcd643a652 double_ended_iterator_last: note when drop order is changed
`iter.last()` will drop all elements of `iter` in order, while
`iter.next_back()` will drop the non-last elements of `iter` when
`iter` goes out of scope since `.next_back()` does not consume its
argument.

When the transformation proposed by `double_ended_iterator_last` would
concern an iterator whose element type has a significant drop, a note is
added to warn about the possible drop order change, and the suggestion
is switched from `MachineApplicable` to `MaybeIncorrect`.
2025-02-19 09:26:39 +01:00
yanglsh e2cdfed0ea fix: map_entry FP on struct member 2025-02-19 16:25:18 +08:00
Samuel Tardieu 45f7a60d31 .last() to .next_back() requires a mutable receiver
In the case where `iter` is a `DoubleEndedIterator`, replacing a call to
`iter.last()` (which consumes `iter`) by `iter.next_back()` (which
requires a mutable reference to `iter`) cannot be done when `iter`
Is not a mutable binding or a mutable reference.

When `iter` is a local binding, it can be made mutable by fixing its
definition site.
2025-02-18 13:51:01 +01:00
Alejandra González e2d9b9a32a fix: needless_option_as_deref FP in trait (#14210)
fixes #14148

Another case of #13077 and #8646

changelog: [`needless_option_as_deref`]: fix FP in trait
2025-02-17 23:33:46 +00:00
Samuel Tardieu 66d19d84ae manual_ok_err: blockify the replacement of an else if …
If the part being replaced is an `if` expression following an `else`,
the replacement expression must be blockified.
2025-02-17 15:49:44 +01:00
Nicholas Nethercote 8cf9eea5b3 Move some Map methods onto TyCtxt.
The end goal is to eliminate `Map` altogether.

I added a `hir_` prefix to all of them, that seemed simplest. The
exceptions are `module_items` which became `hir_module_free_items` because
there was already a `hir_module_items`, and `items` which became
`hir_free_items` for consistency with `hir_module_free_items`.
2025-02-17 13:21:02 +11:00
Alex Macleod 0f20a12ad4 ui_test annotation cleanup (#14232)
Cleans up some changes from
https://github.com/rust-lang/rust-clippy/pull/11421

I searched for any `.stderr` files where the number of errors changed
and reverted + manually added the annotations for them

Also fixes `tests/ui/asm_syntax_not_x86.rs`

r? @flip1995

changelog: none
2025-02-16 17:00:23 +00:00
Alex Macleod d03ae8ba6b ui_test annotation cleanup 2025-02-16 16:51:35 +00:00
lapla-cogito fd17bfe57d add manual_contains lint 2025-02-16 06:21:57 +09:00
Guillaume Gomez 847bd6707d f 2025-02-15 15:41:30 +01:00
Guillaume Gomez 2c0c661e56 Better handle 32bit/64bit-specific ui tests 2025-02-15 15:40:12 +01:00
Guillaume Gomez 8ae4e7f76d Fix tests/ui/transmute_32bit.rs annotations 2025-02-15 15:03:54 +01:00
Samuel Tardieu 0fcc2dba92 Fix 32 bits tests 2025-02-15 14:51:48 +01:00
Guillaume Gomez cc915cced8 Add missing ui annotations to new ui tests 2025-02-15 13:44:26 +01:00
Guillaume Gomez a2c890fa0f Make fmt (weirdly) happy 2025-02-15 13:38:43 +01:00
Guillaume Gomez 1f94d55a18 Fix new tests updates 2025-02-15 13:38:42 +01:00
Guillaume Gomez 8a2dae63c3 Make if_let_mutex test pass on both 2021 and 2024 editions 2025-02-15 13:38:18 +01:00
Guillaume Gomez d5ebe50505 Add manual annotations 2025-02-15 13:38:18 +01:00
Guillaume Gomez 0a990758fb Handle compilation error in builtin_type_shadow.rs 2025-02-15 13:38:18 +01:00
Guillaume Gomez 10184ecbe1 Allowed clippy::tests/ui/attrs.2.fixed in tests/ui/attr.rs because when adding annotations, it doesn't work anymore 2025-02-15 13:38:18 +01:00
Guillaume Gomez f666fd6417 Update UI tests 2025-02-15 13:38:16 +01:00
Jason Newcomb 0dd5c4ddeb Fix used_underscore_items lint uses of foreign functions (#14205)
Fixed #14156

changelog: none
2025-02-15 02:46:49 +00:00
Jason Newcomb 4e899e16f9 unnecessary_map_or: do not consume the comparison value if it does not implement Copy (#14207)
Fix #14201

changelog: [`unnecessary_map_or`]: do not consume the comparison value
if it does not implement `Copy`
2025-02-15 02:45:59 +00:00
Catherine Flores 50ecb6e846 doc_link_code: add check for links with code spans that render weird (#14121)
This is the lint described at
https://github.com/rust-lang/rust/pull/136308#issuecomment-2625485331
that recommends using HTML to nest links inside code.

changelog: [`doc_link_code`]: warn when a link with code and a code span
are back-to-back
2025-02-14 13:55:33 +00:00
Michael Goulet fc532c5b32 Trim suggestion parts to the subset that is purely additive 2025-02-14 00:44:10 -08:00
Timo b83762c578 Fix literal_string_with_formatting_args lint emitted when it should not (#13953)
Fixes #13885.
Fixes https://github.com/rust-lang/rust-clippy/issues/14007.

Problem was that I forgot to check whether or not the `span` was a
"real" one. Because if not, then it starts pointing to pretty much only
wrong content, hence the problems we saw with clippy linting on
`clippy.toml`.

changelog: Fix `literal_string_with_formatting_args` lint emitted when
it should not

r? @samueltardieu
2025-02-13 16:18:44 +00:00
Samuel Tardieu f826193aec unnecessary_map_or: do not consume the non-Copy comparison value 2025-02-13 12:00:38 +01:00
yanglsh c47746ca67 fix: needless_option_as_deref FP in trait 2025-02-13 15:26:11 +08:00
llogiq 4129f5c824 New lint: mem_replace_option_with_some (#14197)
`mem::replace(opt, Some(v))` can be replaced by `opt.replace(v)`.

Close #14195

changelog: [`mem_replace_option_with_some`]: new lint
2025-02-12 19:02:06 +00:00
Samuel Tardieu 342ac8ee28 New lint: mem_replace_option_with_some
`mem::replace(opt, Some(v))` can be replaced by `opt.replace(v)`.
2025-02-12 19:57:14 +01:00
WeiTheShinobi b167895a19 Fix used_underscore_items lint uses of foreign functions 2025-02-13 01:06:32 +08:00
Jason Newcomb 1cb4236a95 New lint: unbuffered_bytes (#14089)
Checks for `Read::bytes()` on an unbuffered Read type.
The default implementation calls `read` for each byte, which can be very
inefficient for data that’s not in memory, such as `File`.

Considerations which I'd like to have feedback on:
* Currently this lint triggers when `.bytes()` is called on any type
that implements `std::io::Read` but not `std::io::BufRead`. This is
quite aggressive and in and may result in false positives. Alternatives:
* Only trigger on concrete types, not generic types. This does mean that
cases where a function is generic over a `R: Read` and calls `.bytes()`
are not caught by the lint, which could be quite a nasty case of this
bug.
  * Only trigger on an allowlist of stdlib types
* Compromise: Is it possible to make this lint `pedantic` on types that
are not on a allowlist?
* Theoretically, a trait implementation of `Read` could override
`.bytes()` with an efficient implementation. I'm not sure how to add
this check to the lint, and I can't find any cases of this being done in
practice.
* I don't think an automatic fix for this lint is possible, but I'd love
to be proven wrong
* This is my first time contributing to clippy, please let me know if I
did anything wrong

Fixes #14087
```
changelog: [`unbuffered_bytes`]: new lint
```
2025-02-12 15:17:52 +00:00
Jason Newcomb a342340e6d add index checks for the slice in manual_slice_fill (#14193)
fix #14192

changelog: [`manual_slice_fill`]: resolve FP caused by missing index
checks for the slice
2025-02-12 15:14:36 +00:00
jonathan 8b6de49ef7 New lint: unbuffered_bytes 2025-02-12 14:57:07 +01:00
Samuel Tardieu da6a05977d {expect,unwrap}_used: add options to lint at compilation time
By default, do not lint `.unwrap()` and `.expect(…)` in always const
contexts, as a failure would be detected at compile time anyway.

New options `allow_expect_in_consts` and `allow_unwrap_in_consts`,
defaulting to `true`, can be turned unset to still lint in always const
contexts.
2025-02-11 22:14:52 +01:00
Alejandra González ffa1caf420 just_underscores_and_digits: fix false positive in error recovery scenario (#14168)
Fixes #12302

changelog: [`just_underscores_and_digits`]: fix false positive in error
recovery scenario
2025-02-11 19:24:48 +00:00
Michael Howell ac15a10b55 just_underscores_and_digits: ignore empty ident
Empty idents come from error recovery, and should imply that a
better error has already been emitted.
2025-02-11 09:35:43 -07:00
Alejandra González c40898e186 declare_interior_mutable_const, borrow_interior_mutable_const: resolve <T as Trait>::AssocT projections (#14125)
changelog: [`declare_interior_mutable_const`,
`borrow_interior_mutable_const`]: resolve `<T as Trait>::AssocT`
projections

---

This came up during https://github.com/rust-lang/rust/pull/130543 where
we have `<T as AtomicPrimitive>::Assoc = AtomicT` instead of just
`AtomicT` and clippy failed to resolve that properly.

This really needs a review, because

- I don't know if `try_normalize_erasing_regions` is the right thing to
call here.
- I'm not sure if I peel off the correct amount of `ValTree::Branch`
layers (I think I do).

Also, shouldn't this lint's infrastructure rely on `Freeze` trait
(https://github.com/rust-lang/rust/issues/121675) instead of hardcoding
a list of known-to-be-interior-mutable types?

---

Previously filed this in the main rust repo
(https://github.com/rust-lang/rust/pull/136369), was asked to do it here
instead
(https://github.com/rust-lang/rust/pull/136369#issuecomment-2628527774).
2025-02-11 16:32:35 +00:00
lapla-cogito 7139436f98 add index checks for the slice in manual_slice_fill 2025-02-11 16:13:26 +09:00
Esteban Küber 39d73d5bbb Use MIR body to identify more "default equivalent" calls
When looking for `Default` impls that could be derived, we look at the
body of their `fn default()` and if it is an fn call or literal we check
if they are equivalent to what `#[derive(Default)]` would have used.

Now, when checking those fn calls in the `fn default()` body, we also
compare against the corresponding type's `Default::default` body to see
if our call is equivalent to that one.

For example, given

```rust
struct S;

impl S {
    fn new() -> S { S }
}

impl Default for S {
    fn default() -> S { S::new() }
}
```

`<S as Default>::default()` and `S::new()` are considered equivalent.
Given that, if the user also writes

```rust
struct R {
    s: S,
}

impl Default for R {
    fn default() -> R {
        R { s: S::new() }
    }
}
```

the `derivable_impls` lint will now trigger.
2025-02-11 02:59:06 +00:00
Esteban Küber 3a0b1ae59d Show diff suggestion format on verbose replacement
```
error[E0610]: `{integer}` is a primitive type and therefore doesn't have fields
  --> $DIR/attempted-access-non-fatal.rs:7:15
   |
LL |     let _ = 2.l;
   |               ^
   |
help: if intended to be a floating point literal, consider adding a `0` after the period and a `f64` suffix
   |
LL -     let _ = 2.l;
LL +     let _ = 2.0f64;
   |
```
2025-02-10 20:21:39 +00:00
Samuel Tardieu b32ad4ce0a Use parentheses when needed in nonminimal_bool lint
Since comparisons on types not implementing `Ord` (such as `f32`) are
not inverted, they must be enclosed in parentheses when they are
negated.
2025-02-10 12:47:54 +01:00
llogiq 521a8001ca Fix let_and_return with temporary variables, and distinguish between Rust editions (#14180)
The first commit fixes #14164 by making sure that temporaries with
non-static references are also looked for in expressions coming from
expansion. The shortcut that was done skipped those parts and reported
an absence of short-lived temporaries, which was incorrect.

The second commit distinguishes between edition 2024 and earlier ones.
Starting from edition 2024, the problematic drop order has been fixed,
and block variables, which might be referenced in a block expression,
are freed after the block expression itself. This allows more
`let_and_return` cases to be reported starting with edition 2024,
whereas in earlier editions an intermediary variable was necessary to
reorder the drops.

Incidentally, since Clippy is compiled in edition 2024 mode, the second
commit has led to a fix in
`clippy_lints/src/matches/significant_drop_in_scrutinee.rs`.

changelog: [`let_and_return`]: lint more cases in edition 2024, and fix
a false positive involving short-lived block temporary variables in
earlier editions.
2025-02-09 23:12:29 +00:00