Commit graph

21563 commits

Author SHA1 Message Date
Manish Goregaokar
85bbba69b0
New lint sliced_string_as_bytes (#14002)
resurrection of https://github.com/rust-lang/rust-clippy/pull/10984

fixes https://github.com/rust-lang/rust-clippy/issues/10981

changelog: [`sliced_string_as_bytes`]: add new lint
`sliced_string_as_bytes`
2025-01-27 20:34:48 +00:00
Manish Goregaokar
ac805d4a4e
Remove "Known problems" section for borrow_interior_mutable_const (#14078)
Remove "Known problems" section for `borrow_interior_mutable_const`
since issue were fixed some time ago - #6110, #5812

changelog: none
2025-01-27 05:14:57 +00:00
Timo
c26985ba80
fixed a missing description of the MSRV option for manual_repeat_n (#14081)
I added `manual_repeat_n` lint before, which has the `MSRV` option.
However, I forgot to add this lint to the lint configuration.

changelog: none
2025-01-26 23:18:24 +00:00
lapla-cogito
0b818aa673
fixed a missing description of the MSRV option for manual_repeat_n 2025-01-27 04:54:40 +09:00
Alejandra González
057f5b36f5
Make unnecessary_map_or work with ref and Deref to Option/Result (#14024)
Receivers which are references to `Option` and `Result`, or who
implement `Deref` to one of those types, will be linted as well.

changelog: [`unnecessary_map_or`]: work with ref and `Deref` to `Option`
and `Result` as well

Fixes #14023

**Note:** this patch must be merged after #13998 – only the second
commit must be reviewed, the first one repeats the patch in #13998 for
mergeability reasons.
2025-01-26 18:06:49 +00:00
Philipp Krones
e84d60daec
set default PR messages to fail the changelog CI (#14069)
I noticed that default PR messages could pass the changelog checking CI.

For example, if a PR is submitted without modifying the PR template, the
following line is mistakenly treated as a valid changelog by the CI:

```
changelog: [`lint_name`]: your change
```
r? flip1995

changelog: none
2025-01-26 15:28:48 +00:00
alexey semenyuk
ba78c227dc
Remove "Known problems" section for borrow_interior_mutable_const 2025-01-26 13:52:52 +05:00
llogiq
913592373d
trigger obfuscated_if_else for .then(..).unwrap_or(..) (#14021)
part of https://github.com/rust-lang/rust-clippy/issues/9100

The `obfuscated_if_else` lint currently only triggers for the pattern
`.then_some(..).unwrap_or(..)`, but there're other cases where this lint
should be triggered, one of which is `.then(..).unwrap_or(..)`.

changelog: [`obfuscated_if_else`]: trigger lint for the
`.then(..).unwrap_or(..)` pattern as well
2025-01-25 23:48:02 +00:00
wowinter13
beeb6f7432 slice-as-bytes: pedantic -> perf 2025-01-25 18:43:07 +01:00
wowinter13
4e94d22291 nit: change placeholders 2025-01-25 18:43:07 +01:00
wowinter13
5855e0a2f1 Small refactoring: irrefutable let pattern 2025-01-25 18:43:07 +01:00
wowinter13
4fef1b46be Fix tests 2025-01-25 18:43:07 +01:00
wowinter13
26a7b322a3 Rename slice_as_bytes -> sliced_string_as_bytes 2025-01-25 18:43:07 +01:00
wowinter13
9e83183f7e uibless for tests 2025-01-25 18:42:45 +01:00
wowinter13
43066fea88 Fix related test 2025-01-25 18:42:45 +01:00
wowinter13
7124d822b4 Fix function signature 2025-01-25 18:42:45 +01:00
wowinter13
307d85409b Address linter & changelog issues 2025-01-25 18:42:45 +01:00
wowinter13
2ad20daa2a Rollback CHANGELOG.md change 2025-01-25 18:42:45 +01:00
wowinter13
c214f5144e Update CHANGELOG.md 2025-01-25 18:42:45 +01:00
wowinter13
d8752dbf40 New lint 2025-01-25 18:42:43 +01:00
lapla-cogito
db977689fd
trigger obfuscated_if_else for .then(..).unwrap_or(..) 2025-01-25 19:57:22 +09:00
llogiq
4825666bd3
add new lint non_std_lazy_statics (#13770)
fixes #12895

detects usage of `once_cell::sync::Lazy` and `lazy_static!`,
recommending usage of `std::sync::LazyLock` instead

Many thanks to @J-ZhengLi for putting in most of the work in #12968

----

changelog: new lint [`non_std_lazy_statics`]
2025-01-25 10:31:14 +00:00
J-ZhengLi
2671e4a5c1 add new lint non_std_lazy_statics
detect usage of `once_cell::sync::Lazy` and `lazy_static!`,
recommending usage of `std::sync::LazyLock` instead
2025-01-24 14:06:46 -07:00
Alex Macleod
d7e20a9c16
docs: fix verbose-bit-mask example (#14055)
changelog: none

`x & 15 == 0` is not equivalent to `x.trailing_zeros() > 4`, as `x =
0b10000` is true for the former and false for the latter.

In fact, clippy itself suggests the following:

```rust
pub fn src(x: i32) -> bool {
    x & 15 == 0 // ~error: bit mask could be simplified with a call to `trailing_zeros`
    ^^^^^^^^^^^ help: try: `x.trailing_zeros() >= 4`
}
```
2025-01-24 15:48:44 +00:00
lapla-cogito
a8551362f2
set default changelog messages to fail the changelog CI 2025-01-24 11:47:21 +09:00
Timo
4b05f50b6b
Add necessary adjustments to suggestion to remove redundant .into_iter() calls (#14035)
Fix #11819

changelog: [`useless_conversion`]: add necessary adjustments to
suggestion to remove redundant `.into_iter()` calls
2025-01-23 13:35:52 +00:00
Catherine Flores
92fac5c64c
clarify message for non-obvious precedence (#14043)
I ran across this message while writing code and thought it was quite
odd. I've simplified it and hopefully made it clearer for non-native
English speakers.

changelog: clarify message for non-obvious precedence
2025-01-23 09:31:51 +00:00
Jacob Pratt
2f2d09a858
clarify message for non-obvious precedence 2025-01-23 01:22:26 -05:00
Catherine Flores
2c8d1ae592
Fix out-of-date comment (#14040)
This comment was left behind when the method receiver was split out from
the method arguments in 4bcaddeeb2.

changelog: none
2025-01-22 22:32:33 +00:00
Manish Goregaokar
3254f02abc
arithmetic_side_effects: check adjusted expression types (#14062)
Fix #14054

changelog: [`arithmetic_side_effects`]: warn about more cases when
`Deref` is involved
2025-01-22 19:47:00 +00:00
Samuel Tardieu
69ff46ec9c arithmetic_side_effects: check adjusted expression types 2025-01-22 19:32:36 +01:00
llogiq
106db265f4
match_bool: fix suggestion if guard is present (#14039)
Without this check, the lint would suggest that

```rust
    match test {
        true if option == 5 => 10,
        _ => 1,
    };
```

is replaced by `if test { 10 } else { 1 }`.

changelog: [`match_bool`]: omit suggestion when guards are present in
`match` expression
2025-01-22 17:35:33 +00:00
Timo
c024c1327b
unnecessary_semicolon: do not lint if it may cause borrow errors (#14049)
Before edition 2024, some temporaries used in scrutinees of a `match`
used as the last expression of a block may outlive some referenced local
variables. Prevent those cases from happening by checking that alive
temporaries with significant drop do have a static lifetime.

The check is performed only for edition 2021 and earlier, and for the
last statement if it would become the last expression of the block.

changelog: [`unnecessary_semicolon`]: prevent borrow errors in editions
lower than 2024

r? @y21
2025-01-22 15:38:43 +00:00
Fridtjof Stoldt
67e6bf33fe
Suggest using Vec::extend() in same_item_push (#13987)
Using `Vec::extend(std::iter::repeat_n(item, N))` allows to use the more
natural number of elements to add `N`, as is probably done in the
original loop, instead of computing the difference between the existing
number of elements and the wanted one.

Before MSRV 1.82, the older suggestion to use `Vec::resize()` is still
issued.

Inspired by #6156 (which predates `repeat_n()`).

changelog: [`same_item_push`]: recommend using `Vec::extend()` to extend
a vector
2025-01-22 14:41:13 +00:00
Samuel Tardieu
9dca770aec unnecessary_semicolon: do not lint if it may cause borrow errors
Before edition 2024, some temporaries used in scrutinees in a `match`
used as the last expression of a block may outlive some referenced
local variables. Prevent those cases from happening by checking that
alive temporaries with significant drop do have a static lifetime.

The check is performed only for edition 2021 and earlier, and for the
last statement if it would become the last expression of the block.
2025-01-22 13:40:26 +01:00
Samuel Tardieu
71ba2cf1e5 Extract leaks_droppable_temporary_with_limited_lifetime() 2025-01-22 13:40:26 +01:00
Timo
88d83b6e55
short_circuit_statement: handle macros and parenthesis better (#14047)
- The lint no longer triggers if one of the operands in the boolean
expression comes from a macro expansion.
- Parenthesis are now removed inside the generated block if they are no
longer necessary.
- Error markers have been added.

changelog: [`short_circuit_statement`]: better handling of macros and
better looking suggestions
2025-01-22 02:54:49 +00:00
Timo
396de5748b
don't trigger needless_late_init when the first usage is in macro (#14053)
fix #13776

changelog: [`needless_late_init`]: don't trigger `needless_late_init`
when the first usage is in macro
2025-01-22 01:56:53 +00:00
lapla-cogito
26838f8552
don't trigger needless_late_init when the first usage is in macro 2025-01-22 10:44:53 +09:00
Joshua Wong
a18b75a87e docs: fix verbose-bit-mask example
changelog: none

`x & 15 == 0` is not equivalent to `x.trailing_zeros() > 4`, as `x = 0b10000` is true for
the former and false for the latter.

In fact, clippy itself suggests the following:

```rust
pub fn src(x: i32) -> bool {
    x & 15 == 0 // ~error: bit mask could be simplified with a call to `trailing_zeros`
    ^^^^^^^^^^^ help: try: `x.trailing_zeros() >= 4`
}
```
2025-01-21 19:50:48 -05:00
Samuel Tardieu
7f162fa9af short_circuit_statement: handle macros and parenthesis better
- The lint no longer triggers if the expression comes from macro
  expansion
- Parenthesis are now removed inside the generated block if they are no
  longer necessary.
2025-01-21 09:12:38 +01:00
Timo
d1b5fa2416
fix: correct suggestion for significant_drop_in_scrutinee in expressions (#14019)
This PR fixes an issue with the `significant_drop_in_scrutinee`, where
the lint generates invalid Rust syntax when suggesting fixes for match
expressions that are part of larger expressions, such as in assignment
contexts. For example:

```rust
    let mutex = Mutex::new(State {});
    let _ = match mutex.lock().unwrap().foo() {
        true => 0,
        false => 1,
    };
```
would suggest:
```rust
let _ = let value = mutex.lock().unwrap().foo();
match value {
```
With this PR, it now suggests:
```rust
let value = mutex.lock().unwrap().foo();
let _ = match value {
```

closes: #13986

changelog: [`significant_drop_in_scrutinee`] Fix incorrect suggestion
for `significant_drop_in_scrutinee` lint in expression context
2025-01-21 02:28:23 +00:00
Samuel Tardieu
0c3deeb246 match_bool: omit suggestion if guard is present
Without this check, the lint would suggest that

```rust
    match test {
        true if option == 5 => 10,
        _ => 1,
    };
```

is replaced by `if test { 10 } else { 1 }`.
2025-01-20 19:40:05 +01:00
llogiq
8f1b4bb87a
New lint: unnecessary_semicolon (#14032)
This lint detects and removes the unnecessary semicolon after a `match`
or `if` statement returning `()`. It seems to be quite a common
"mistake", given the number of hits (88) we had in the Clippy sources
themselves.

The lint doesn't bother about loops, as `rustfmt` already removes the
extra semicolon. It doesn't handle blocks either, as an extra block
level, followed or not by a semicolon, is likely intentional.

I propose to put the lint in `pedantic`, as putting it in `style` seems
quite hazardous given the number of hits.

Note: there exists a `redundant-semicolon` lint in the compiler, but it
is an early lint and cannot check that the expression evaluates to `()`,
so it ignores the cases we're handling here.

----

changelog: [`unnecessary_semicolon`]: new lint
2025-01-20 17:39:37 +00:00
Samuel Tardieu
eff57e29a9 Fix out-of-date comment
This comment was left behind when the method receiver was split out from
the method arguments in 4bcaddeeb2.
2025-01-20 10:48:34 +01:00
Samuel Tardieu
01907f77fc useless_conversion: use multipart suggestion to make adjustments more visible 2025-01-20 08:43:47 +01:00
Timo
2280b8a099
Use clearer multipart suggestions for unnecessary_map_or lint (#13998)
A multipart suggestion will be used whenever the method call can be
replaced by another one with the first argument removed. It helps place
the new method call in context, especially when it is part of a larger
expression.

This fixes #13995 by applying a suggestion made by @y21.

r? @y21

changelog: [`unnecessary_map_or`]: better representation of suggestions
by placing them in context
2025-01-19 22:11:46 +00:00
Timo
0707fe8474
add a new lint for repeat().take() that can be replaced with repeat_n() (#13858)
close #13271

changelog: add new `manual_repeat_n` lint
2025-01-19 21:59:22 +00:00
Samuel Tardieu
1ccef58dc0 useless_conversion: add needed adjustments to suggestion 2025-01-19 22:42:38 +01:00
Samuel Tardieu
3a7f50f6d3 Apply unnecessary_semicolon to Clippy sources 2025-01-19 15:34:07 +01:00