Commit graph

21973 commits

Author SHA1 Message Date
Catherine Flores
231bf457ba
Make struct_field_names check private fields of public structs. (#14076)
Currently, If a struct is `pub` and its field is private, and
`avoid-breaking-exported-api = true` (default), then
`struct_field_names` will not lint the field, even though changing the
field’s name is not a breaking change. This is because the
breaking-exported-api condition was checking the visibility of the
struct, not its fields (perhaps because the same code was used for
enums). With this change, Clippy will check the field’s effective
visibility only.

Note: This change is large because some functions were moved into an
`impl` to be able to access more configuration. Consider viewing the
diff with whitespace ignored.

changelog: [`struct_field_names`]: also check private fields of public
structs
2025-03-05 22:38:15 +00:00
Catherine Flores
06e75900f7
Refactor function after adding a new diagnostic item (#14306)
The `has_eligible_receiver()` function had been adapted *a minima* when
the `sym::ControlFlow` diagnostic item has been added to rustc. This
refactors the function content to make its meaning clearer.

changelog: none
2025-03-05 22:35:00 +00:00
Catherine Flores
ad633bedd6
Use size_of from the prelude instead of imported (#14355)
Use `std::mem::{size_of, size_of_val, align_of, align_of_val}` from the
prelude instead of importing or qualifying them.

These functions were added to all preludes in Rust 1.80.

changelog: none
2025-03-05 21:57:30 +00:00
Alex Macleod
8108bd8d43
Remove Known problems section for vec_box (#14252)
Remove Known problems section for `vec_box` since
[issue](https://github.com/rust-lang/rust-clippy/issues/3530#issuecomment-446058452)
> Vec<Box<T: Sized>> makes sense if T is a large type

can be handled

> The lint already checks that the type's size is lower than a threshold
to avoid linting on large types.

changelog: none
2025-03-05 13:41:31 +00:00
Thalia Archibald
e8cd3d4752 Use size_of from the prelude instead of imported
Use `std::mem::{size_of, size_of_val, align_of, align_of_val}` from the
prelude instead of importing or qualifying them.

These functions were added to all preludes in Rust 1.80.
2025-03-05 00:37:40 -08:00
llogiq
9538e5bcd0
Walk back to the root context to compute the span (#14349)
Since the error kind (`io::ErrorKind::other`) is in the root context,
the error message must be found in the root context as well to compute
the correct span to remove.

Fix #14346

changelog: [`io_error_other`]: fix non-applicable suggestion

r? @llogiq
2025-03-05 05:52:19 +00:00
Kevin Reid
8c73b76fb2 Move check_variant() code into a method of ItemNameRepetitions too. 2025-03-04 10:49:13 -08:00
Kevin Reid
2067375697 Make struct_field_names lint on private fields of public structs.
Currently, If a struct is `pub` and its field is private, and
`avoid-breaking-exported-api = true` (default), then `struct_field_names`
will not lint the field, even though changing the field’s name is not a
breaking change. This is because the breaking-exported-api condition was
checking the visibility of the struct, not its fields (perhaps because
the same code was used for enums). With this change, Clippy will check
 the field’s effective visibility only.

Note: This change is large because some functions were moved into an
`impl` to be able to access more configuration. Consider viewing the
diff with whitespace ignored.
2025-03-04 10:49:13 -08:00
Catherine Flores
2440f51696
don't trigger unnecessary_debug_formatting in tests (#14347)
close #14345

changelog: [`unnecessary_debug_formatting`]: don't lint in tests
2025-03-04 16:35:09 +00:00
Alex Macleod
dd8cf052c2
better help for mixed_case_hex_literals (#14235)
It can be error-prone for developers to manually change literals with
mixed uppercase and lowercase letters into consistently all-lowercase or
all-uppercase literals. Therefore, this lint rule should suggest
alternative literals.

changelog: [`mixed_case_hex_literals`]: add alternative suggestions
2025-03-04 14:10:44 +00:00
Samuel Tardieu
9275ae994b Walk back to the root context to compute the span
Since the error kind (`io::ErrorKind::other`) is in the root context,
the error message must be found in the root context as well to compute
the correct span to remove.
2025-03-04 12:00:38 +01:00
lapla-cogito
e6a4cf63ad
don't trigger unnecessary_debug_formatting in tests 2025-03-04 17:46:15 +09:00
lapla-cogito
e587a5d0f0
better help for mixed_case_hex_literals 2025-03-04 17:43:14 +09:00
Philipp Krones
cdc1d9d87a
Lint more cases with ptr_eq (#14339)
This PR:

- lints more case of raw pointer comparisons
- do not omit the named function to raw pointer conversion before
suggesting
- trigger the `ptr_eq` lint only if `cmp_null` doesn't trigger first, as
this is a more specialized version
- lints against `!=` in addition to `==`

The `ptr_eq` code has been moved from under `operators` to `ptr.rs`, in
order to benefit from factorization.

Fix #14337

changelog: [`ptr_eq`]: handle more cases
2025-03-04 08:15:00 +00:00
Philipp Krones
b4b7c7b057
Use the latest nightly rust to run linkcheck (#14348)
changelog: none
2025-03-04 07:55:17 +00:00
Samuel Tardieu
414136239b Use the latest nightly rust to run linkcheck 2025-03-04 08:50:26 +01:00
Alejandra González
a9c61ec1e1
needless_collect: avoid warning if non-iterator methods are used (#14147)
changelog: [`needless_collect`]: avoid warning if non-`Iterator` methods
are called on the result of `into_iter`

Fixes #13430
2025-03-02 22:40:07 +00:00
Alejandra González
aa2180f5fe
fix: map_entry suggest wrongly when key is not Copy (#14314)
Closes #13306
Closes #9925
Closes #9470
Closes #9305

Clippy gives wrong suggestions when the key is not `Copy`. As suggested
in #9925, in such cases Clippy will simply warn but no fix.

changelog: [`map_entry`]: fix wrong suggestions when key is not `Copy`
2025-03-02 20:55:17 +00:00
Samuel Tardieu
336d34481e Apply ptr_eq lint only if cmp_null is not applicable
The `cmp_null` lint is more specialized than `ptr_eq`. The former should
take precedence, unless the user allows it.
2025-03-02 16:21:12 +01:00
Samuel Tardieu
d7d0abd2ad Lint more cases of ptr::eq()
Also, do not strip conversions of a function pointer to a `*const`, as
no implicit conversion will take place.
2025-03-02 15:50:13 +01:00
Fridtjof Stoldt
62f34f2f58
fix: undocumented_unsafe_blocks FP on trait/impl items (#13888)
fixes #11709

Continuation of #12672. r? @Alexendoo if you don't mind?

changelog: [`undocumented_unsafe_blocks`] fix FP on trait/impl items
2025-03-01 15:53:45 +00:00
llogiq
35746de197
comparison_chain: stylepedantic (#14219)
The `comparison_chain` lint might suggest code which seems less natural
to beginners.

[Discussion](https://rust-lang.zulipchat.com/#narrow/channel/257328-clippy/topic/demote.20some.20lints.20to.20.60pedantic.60)

changelog: [`comparison_chain`]: change lint category to `pedantic`
2025-03-01 13:41:44 +00:00
yanglsh
d027ca95de Add regression test for #11709 2025-03-01 20:45:46 +08:00
yanglsh
3899488e53 fix undocumented_unsafe_blocks FP in long assignment 2025-03-01 20:35:48 +08:00
yanglsh
91d20cbb82 Use inner span in undocumented_unsafe_blocks 2025-03-01 20:35:18 +08:00
J-ZhengLi
d395646a60 fix [undocumented_unsafe_blocks] FP with trait/impl items 2025-03-01 20:33:24 +08:00
Fridtjof Stoldt
1419ac2982
Suggest using #[expect] to check lint positioning (#14327)
Using `#[allow]` will also apply to child HIR nodes, while `#[expect]`
will ensure that the proper HIR node has been used for positioning the
lint.

changelog: none
2025-03-01 10:48:26 +00:00
Samuel Tardieu
e15b9a09e8 Suggest using #[expect] to check lint positioning
Using `#[allow]` will also apply to child HIR nodes, while `#[expect]`
will ensure that the proper HIR node has been used for positioning the
lint.
2025-03-01 09:34:55 +01:00
llogiq
817853044f
Extend {implicit,inverted}_saturating_sub to expressions (#14310)
changelog: [`implicit_saturating_sub`, `inverted_saturating_sub`]:
extend lints from local variables to side-effect free expressions

Noticed when #14308 introduced an implicit `saturating_sub` operation
and didn't get tagged.
2025-03-01 05:51:35 +00:00
Samuel Tardieu
029a6db879 Apply implicit_saturating_sub to Clippy sources 2025-02-28 23:50:43 +01:00
Samuel Tardieu
60e1d7ec2d Extend {implicit,inverted}_saturating_sub to expressions
Side-effect free expressions are eligible to these lints,
whereas previously only local variables were checked.
2025-02-28 23:50:43 +01:00
Timo
9f9a822509
Check for MSRV attributes in late passes using the HIR (#13821)
Closes https://github.com/rust-lang/rust-clippy/issues/13169

Late lints now use a parent iter to check for `#[clippy::msrv]`
attributes instead of keeping track with `extract_msrv_attr`. This is
required for incremental lints since they run per module instead of per
crate so don't visit all the necessary attributes

As a basic optimisation if no `#[clippy::msrv]` attributes are
discovered in early passes the HIR access is skipped completely and just
the configured MSRV is used, for most code bases this will be the case

changelog: none
2025-02-28 20:48:55 +00:00
Timo
6f66a6037e
Fix ICE in manual_map lint (#14326)
node_args doesn't work with struct literals and expr_ty must be used
instead

r? @y21

changelog: none

(No changelog, as this ICE didn't make it to the Rust repo, as it was
caught during the sync)

Fixes #14325
2025-02-28 20:19:03 +00:00
Philipp Krones
900aab72cd
Fix ICE in manual_map lint
node_args doesn't work with struct literals and expr_ty must be used instead
2025-02-28 21:14:02 +01:00
Alex Macleod
5b0004c45f Migrate clippy_lints to new MSRV API 2025-02-28 18:15:11 +00:00
Alex Macleod
0972c3b565 Check for MSRV attributes in late passes using the HIR 2025-02-28 18:09:44 +00:00
Timo
2cdb90d961
New lint: manual_midpoint (#13851)
changelog: [`manual_midpoint`]: new lint

Closes #13849
2025-02-28 16:27:34 +00:00
yanglsh
18616dcd4f fix: map_entry suggest wrongly when key is not Copy 2025-02-28 23:35:53 +08:00
Alejandra González
e1c1ac1592
configuration option to lint incompatible_msrv in test code (#14279)
fixes #14277

changelog: [`incompatible_msrv`]: add config option
[`check-incompatible-msrv-in-tests`] to enable in `#[test]` and
`#[cfg(test)]` code.
2025-02-28 12:41:46 +00:00
Samuel Tardieu
baadee8fd3 New lint: manual_midpoint 2025-02-27 22:12:16 +01:00
Samuel Tardieu
06175f43b3 Add is_float_literal utility 2025-02-27 22:10:57 +01:00
Philipp Krones
715d3f9224
Rustup (#14300)
Out of cycle sync, as it is complicated and confusing to resolve merge
conflicts on the Rust side. This needs review for
eda3e649a41e0e73cb2e3ee6b98cbf8d7c12acae and
4d8766caaf11a14194406b8997243bb626000aae as well as the comment I'll
leave below.

changelog: none
2025-02-27 21:02:32 +00:00
Philipp Krones
b3d35b1af6 Bump nightly version -> 2025-02-27 2025-02-27 21:51:42 +01:00
Philipp Krones
28555d1231 Split must_use_unit test into an unfixable part
With the attribute refactor in rustc, making this case machine applicable is not
easily possible anymore. This splits up the tests properly.
2025-02-27 21:51:42 +01:00
Philipp Krones
53a1ff70e8 Check os_str_display MSRV instead of feature
This feature was stabilized, so the FormatArgs lints should check if the MSRV of
the stabilization is met, rather than checking if the feature is enabled.
2025-02-27 21:51:42 +01:00
Philipp Krones
02e812af4d Merge remote-tracking branch 'upstream/master' into rustup 2025-02-27 21:51:42 +01:00
Catherine Flores
15180d4eb9
macro_use_import: Don't check is attribute comes from expansion (#14317)
It is not possible to write a declarative macro, that produces an
attribute w/o
an item attached to it. This means that the `check_item` will already
insert the
span in the map, if it came from an expansion. So additionally checking
if the
macro came from an expansion doesn't add anything here. So the
`check_attribute` function, and with that the problematic `attr.span()`
call can
be completely removed.

Fixes https://github.com/rust-lang/rust-clippy/issues/14303

r? @y21

cc @jdonszelmann

changelog: Fix ICE in [`macro_use_import`] lint
2025-02-27 19:51:57 +00:00
Philipp Krones
063d6aef0e
macro_use_import: Don't check is attribute comes from expansion
It is not possible to write a declarative macro, that produces an attribute w/o
an item attached to it. This means that the `check_item` will already insert the
span in the map, if it came from an expansion. So additionally checking if the
macro came from an expansion doesn't add anything here. So the
`check_attribute` function, and with that the problematic `attr.span()` call can
be completely removed.

Fixes #14303
2025-02-27 20:42:56 +01:00
Alex Macleod
4a9b8c6415
fix: map_entry FP inside closure (#14307)
Closes #11976

changelog: [`map_entry`]: fix FP inside closure
2025-02-27 14:42:00 +00:00
yanglsh
329acde93e fix: map_entry FP inside closure 2025-02-27 21:28:00 +08:00