Commit graph

22669 commits

Author SHA1 Message Date
Samuel Tardieu
d82e51b640
Test that all interned symbols are referenced in Clippy sources 2025-05-25 11:52:24 +02:00
Samuel Tardieu
c12bc22167
Update askama to 0.14.0 version (#14888)
No breaking changes for clippy in this update (which only impacts the
lint page).

The askama release information is
[here](https://github.com/askama-rs/askama/releases/tag/v0.14.0).

r? @samueltardieu

changelog: update askama version to `0.14.0`
2025-05-25 07:26:12 +00:00
Guillaume Gomez
f674c809c8 Update askama to 0.14.0 version 2025-05-24 21:18:16 +02:00
llogiq
b6b97a741c
Fix assign_op_pattern FP on unstable const trait (#14886)
Closes rust-lang/rust-clippy#14871

----

changelog: [`assign_op_pattern`]: fix false positive on unstable const
trait
2025-05-24 19:08:46 +00:00
yanglsh
03af37302c fix: assign_op_pattern FP on unstable const trait 2025-05-25 02:02:11 +08:00
dswij
24a2a6629d
Support different lintcheck CARGO_TARGET_DIR env variables (#14859)
Make lintcheck support different `CARGO_TARGET_DIR`, do not hardcode
`target` (useful for perf)

changelog:none
2025-05-24 16:57:47 +00:00
llogiq
836c6579d7
Remove compiletest headers test (#14884)
`ui_test` detects old style headers so it's redundant

changelog: none
2025-05-24 16:20:01 +00:00
Alex Macleod
e3adf1428b Remove compiletest headers test 2025-05-24 15:27:31 +00:00
Jason Newcomb
1029572c19
Optimize documentation lints **a lot** (2/2) (7.5% -> 1%) (#14870)
So, after https://github.com/rust-lang/rust-clippy/pull/14693 was
merged,
this is the continuation. It performs some optimizations on
`Fragments::span`
, makes it so we don't call it so much, and makes a 85.75% decrease
(7.51% -> 1.07%)
in execution samples of `source_span_for_markdown_range` and a 6.39% ->
0.88%
for `core::StrSearcher::new`. Overall a 13.11% icount decrase on
docs-heavy crates.

Benchmarked mainly on `regex-1.10.5`.

@rustbot label +performance-project

This means that currently our heaviest function is
`rustc_middle::Interners::intern_ty`, even
for documentation-heavy crates

Along with rust-lang/rust-clippy#14693, this makes the lint a 7% of what
it was before and makes it so that even in the most doc-heavy of crates
it's not an issue.

changelog:Optimize documentation lints by a further 85%

r? @Jarcho
2025-05-24 00:22:26 +00:00
blyxyas
4a7598f815 [HEAVY PERF] Optimize documentation lints 2/2
So, after https://github.com/rust-lang/rust-clippy/pull/14693 was merged,
this is the continuation. It performs some optimizations on `Fragments::span`
, makes it so we don't call it so much, and makes a 85.75% decrease (7.51% -> 10.07%)
in execution samples of `source_span_for_markdown_range` and a 6.39% -> 0.88%
for `core::StrSearcher::new`. Overall a 13.11% icount decrase on docs-heavy crates.

Benchmarked mainly on `regex-1.10.5`.

This means that currently our heaviest function is `rustc_middle::Interners::intern_ty`, even
for documentation-heavy crates

Co-authored-by: Roope Salmi <rpsalmi@gmail.com>
2025-05-23 19:46:28 +02:00
Alejandra González
7ab910f935
needless_borrow: do not contradict dangerous_implicit_autorefs (#14810)
Rust 1.88 introduces the `dangerous_implicit_autorefs` lint which warns
about using implicit autorefs on a place obtained from a raw pointer, as
this may create aliasing issues.

Prevent `clippy::needless_borrow` from triggering in this case, by
disabling the lint when taking a reference on a raw pointer dereference.
There might be a better way for doing this in the long run with a finer
way of distinguish the problematic cases, but this will prevent Clippy
from contradicting the compiler in the meantime.

Fixes rust-lang/rust-clippy#14743

changelog: [`needless_borrow`]: do not contradict the compiler's
`dangerous_implicit_autorefs` lint even though the refererences are not
mandatory

@rustbot label +beta-nominated

<!-- TRIAGEBOT_START -->

<!-- TRIAGEBOT_SUMMARY_START -->

### Summary Notes

- [Beta nomination for
1.88](https://github.com/rust-lang/rust-clippy/pull/14810#issuecomment-2883753957)
by [samueltardieu](https://github.com/samueltardieu)

Generated by triagebot, see
[help](https://forge.rust-lang.org/triagebot/note.html) for how to add
more
<!--
TRIAGEBOT_SUMMARY_DATA_START$${"entries_by_url":{"https://github.com/rust-lang/rust-clippy/pull/14810#issuecomment-2883753957":{"title":"Beta
nomination for
1.88","comment_url":"https://github.com/rust-lang/rust-clippy/pull/14810#issuecomment-2883753957","author":"samueltardieu"}}}$$TRIAGEBOT_SUMMARY_DATA_END
-->

<!-- TRIAGEBOT_SUMMARY_END -->
<!-- TRIAGEBOT_END -->
2025-05-23 17:37:41 +00:00
Samuel Tardieu
0a059d9e97
needless_borrow: do not contradict dangerous_implicit_autorefs
Rust 1.88 introduces the `dangerous_implicit_autorefs` lint which warns
about using implicit autorefs on a place obtained from a raw pointer,
as this may create aliasing issues.

Prevent `clippy::needless_borrow` from triggering in this case,
by disabling the lint when taking a reference on a raw pointer
dereference. There might be a better way for doing this in the long run
with a finer way of distinguish the problematic cases, but this will
prevent Clippy from contradicting the compiler in the meantime.
2025-05-23 11:12:31 +02:00
Alejandra González
5dccb101ed
Fix needless_for_each suggests wrongly when closure has no braces (#14735)
Closes rust-lang/rust-clippy#14734

changelog: [`needless_for_each`] wrong suggestions when closure has no
braces
2025-05-22 16:25:49 +00:00
Jason Newcomb
a6e40fa9e9
[Perf] Optimize documentation lints **a lot** (1/2) (18% -> 10%) (#14693)
Turns out that `doc_markdown` uses a non-cheap rustdoc function to
convert from markdown ranges into source spans. And it was using it a
lot (about once every 17 lines of documentation on `tokio`, which ends
up being about 2000 times).

This ended up being about 18% of the total Clippy runtime as discovered
by lintcheck --perf in docs-heavy crates. This PR optimizes one of the
cases in which Clippy calls the function, and a future PR once
pulldown-cmark/pulldown-cmark#1034 is merged will be opened. This PR
lands the use of the function into the single-digit zone.

Note that not all crates were affected by this crate equally, those with
more docs are affected far more than those light ones.

changelog:[`clippy::doc_markdown`] has been optimized by 50%
2025-05-21 22:01:41 +00:00
blyxyas
acff5d36cc Review comments & Add testing 2025-05-21 23:44:28 +02:00
Samuel Tardieu
3da4c1033a
Improve speed of cargo dev fmt (#14862)
This stops using `cargo fmt` and instead calls rustfmt directly with the
list of all files.

All `cargo fmt` does is find the crate roots and passes the edition from
`cargo.toml`. Since the edition is set in `rustfmt.toml` for the test
files and we're already iterating through all the files this is not
needed.

`--skip-children` is used since we already pass all the files, so the
automatic detection isn't buying us anything other than running slower.

~Second commit~ (part of the first commit now) is a change to only use
the `ignore` option in `rustfmt.toml` rather than having a way in `cargo
dev fmt` to ignore files.

r? @samueltardieu

changelog: none
2025-05-21 20:31:46 +00:00
Jason Newcomb
9fa448a119
Make trivial-copy-size-limit consistently the size of the target pointer (#13319)
Fixes
https://rust-lang.zulipchat.com/#narrow/stream/257328-clippy/topic/Ambiguous.20default.20value.20for.20.60trivial-copy-size-limit.60

The current situation is

| Target width | `trivial-copy-size-limit`|
|--------|--------|
| 8-bit | 2 |
| 16-bit | 4 |
| 32-bit | 8 |
| 64-bit | 8 |

~~Since practically speaking it's almost always 8, let's go with that as
the unconditional default to make it easier to understand~~

Now defaults to `target_pointer_width`

changelog: [`trivial-copy-size-limit`] now also defaults to the size of
a target pointer (unchanged for 64-bit targets)
2025-05-21 20:05:31 +00:00
Jason Newcomb
106ac79ecb Add expect_action helper to clippy_dev 2025-05-21 15:09:35 -04:00
Jason Newcomb
544c300fb6 Improve speed of cargo dev fmt. 2025-05-21 15:09:35 -04:00
blyxyas
f1ad1cd799 Support different lintcheck CARGO_TARGET_DIR 2025-05-21 17:24:20 +00:00
Philipp Krones
cadf98bb7d
Rustup (#14860)
r? @ghost

Quick out-of cycle sync to fix an ICE that was already reported twice

changelog: none
2025-05-21 12:55:45 +00:00
Philipp Krones
8a28b797b8
Bump nightly version -> 2025-05-21 2025-05-21 14:50:25 +02:00
Philipp Krones
910e640f9b
Merge remote-tracking branch 'upstream/master' into rustup 2025-05-21 14:50:06 +02:00
Timo
03ba508d0e
Fixes manual_slice_size_computation ICE and triggers in const context (#14804)
The first commit fixes rust-lang/rust-clippy#14802: when a slice is
directly present, it must be dereferenced (instead of referenced -1
times) before being passed to `mem::size_of_val()`.

The second commit triggers the lint in a `const` contact when MSRV ≥
1.85.

changelog: [`manual_slice_size_computation`]: fix ICE in suggestion to
efficiently compute the size of a slice, and trigger the lint in `const`
context as well
2025-05-20 22:35:15 +00:00
Timo
5687ed5aae
Various macro fixes for loop lints (#14631)
The `explicit_into_iter_loop`, `explicit_iter_loop` and `iter_next_loop`
will now:

- trigger only when the triggering expression is not located into macro
code;
- properly expose code rewrite proposal with code coming from the root
context.

changelog: [`explicit_into_iter_loop`, `explicit_iter_loop`,
`iter_next_loop`]: behave in macro context

Fixes rust-lang/rust-clippy#14630
2025-05-20 22:17:38 +00:00
yanglsh
520cb092b8 Apply needless_for_each to clippy itself 2025-05-20 18:07:57 +08:00
yanglsh
e5617a79fb fix: needless_for_each suggests wrongly when closure has no braces 2025-05-20 18:07:57 +08:00
Jason Newcomb
f00c58b374
Make lint span smaller for needless return (#14790)
Fixes rust-lang/rust-clippy#14750 by reducing the lint span for
needless_return.

changelog: [`needless_return`]: Lint span no longer wraps to previous
line
2025-05-20 09:23:56 +00:00
Jason Newcomb
6753e164be
Fix ICE while computing type layout (#14837)
If a type is incomplete, for example if generic parameters are not
available yet, although they are not escaping, its layout may not be
computable. Calling `TyCtxt::layout_of()` would create a delayed bug in
the compiler.

changelog: [`zero_sized_map_values`]: fix ICE

Fixes rust-lang/rust-clippy#14822

r? @Jarcho
2025-05-19 23:33:39 +00:00
Samuel Tardieu
72a4e33d69
Fix ICE while computing type layout
If a type is incomplete, for example if generic parameters are not
available yet, although they are not escaping, its layout may not
be computable. Calling `TyCtxt::layout_of()` would create a delayed bug
in the compiler.
2025-05-20 01:21:22 +02:00
Samuel Tardieu
8224956dff
Various macro fixes for loop lints
The `explicit_into_iter_loop`, `explicit_iter_loop` and `iter_next_loop`
will now:

- trigger only when the triggering expression is not located into macro
  code;
- properly expose code rewrite proposal with code coming from the root
  context.
2025-05-20 00:48:19 +02:00
Alejandra González
66697e84b1
needless_match: do not pretend that return is not significant in an expression (#14757)
A `return` in an expression makes it divergent and cannot be removed
blindly. While this stripping might have been introduced as a way to
catch more cases, it was improperly used, and no tests exhibit a failure
when this special handling is removed.

changelog: [`needless_match`]: do not strip `return` as it might make
the `if let` or `match` divergent in some cases

Fixes rust-lang/rust-clippy#14754
2025-05-19 22:12:43 +00:00
Jason Newcomb
b87e90b28f
Use interned symbols instead of strings in more places (#14840)
This patch series makes heavy use of interned symbols when matching
against known method names:

- the first commit reorders the current list of symbols in
`clippy_utils::sym`
- the second commit adds symbol reordering and order checking to `clippy
dev fmt` / `clippy dev fmt --check`
- the third commit converts many uses of string matching during linting
to symbols matching

The symbols are kept as-is (not rendered as strings) as much as possible
to avoid needing locking the interner as much as possible. Static
strings have been kept when they are only used when emitting a
diagnostic, as there is no benefit in using interned strings for
de-interning them right after.

changelog: none

r? @Alexendoo
2025-05-19 21:07:29 +00:00
Samuel Tardieu
e16801e68c
Use symbols instead of &str when possible 2025-05-19 22:47:57 +02:00
Samuel Tardieu
82bf659dc8
Ensure that symbols list stays sorted 2025-05-19 22:47:57 +02:00
Samuel Tardieu
bb724f3421
Sort the existing list of symbols 2025-05-19 22:47:57 +02:00
Alejandra González
d4e7e5ba31
Access items through rustc_session instead of rustc_lint_defs (#14852)
Items such as the `declare_tool_lint!()` macro are publicly reexported
from `rustc_lint_defs` to `rustc_session`. Use the latter for
consistency.

changelog: none
2025-05-19 18:17:04 +00:00
Jason Newcomb
e34e8ac42b
cargo dev fmt: format clippy_lints_internal as well (#14853)
changelog: none
r? @Jarcho
2025-05-19 17:22:14 +00:00
Samuel Tardieu
ac7c87e044
Remove obsolete restriction in code (#14851)
changelog: none
2025-05-19 16:56:31 +00:00
Samuel Tardieu
608f6822ca
cargo dev fmt: format clippy_lints_internal as well 2025-05-19 18:10:59 +02:00
Samuel Tardieu
e2b1de107f
Access items through rustc_session instead of rustc_lint_defs
Items such as the `declare_tool_lint!()` macro are publicly reexported
from `rustc_lint_defs` to `rustc_session`. Use the latter for
consistency.
2025-05-19 18:05:34 +02:00
Samuel Tardieu
db42c7dddc
Remove obsolete restriction in code 2025-05-19 17:50:22 +02:00
Samuel Tardieu
ebc2a68fe8
Add new useless_concat lint (#13829)
Fixes #13793.

Interestingly enough, to actually check that the macro call has at least
two arguments, we need to use the rust lexer after getting the original
source code snippet.

changelog: Add new `useless_concat` lint
2025-05-19 15:11:37 +00:00
Alejandra González
df33aaf540
Check if dropping an expression may have indirect side-effects (#14594)
It is not enough to check if an expression type implements `Drop` to
determine whether it can have a significant side-effect.

Also, add tests for unchecked cases which were explicitly handled in the
code, such as checking for side effect in a `struct`'s fields, or in its
base expression.

Fix rust-lang/rust-clippy#14592

changelog: [`no_effect_underscore_binding`]: do not propose to remove
the assignment of an object if dropping it might indirectly have a
visible side effect
2025-05-19 11:41:40 +00:00
Samuel Tardieu
d44e35d595
Docs: Use spaces in good first issue label (#14844)
This unifies the Clippy repo with the rest of the rust org repos.

changelog: none
2025-05-19 07:55:42 +00:00
Philipp Krones
7123f2acf7
Docs: Use spaces in good first issue label
This unifies the Clippy repo with the rest of the rust org repos.
2025-05-19 09:37:47 +02:00
Stuart Cook
a22efe773d Rollup merge of #140874 - mejrs:rads, r=WaffleLapkin
make `rustc_attr_parsing` less dominant in the rustc crate graph

It has/had a glob re-export of `rustc_attr_data_structures`, which is a crate much lower in the graph, and a lot of crates were using it *just* (or *mostly*) for that re-export, while they can rely on `rustc_attr_data_structures` directly.

Previous graph:
![graph_1](https://github.com/user-attachments/assets/f4a5f13c-4222-4903-b56d-28c83511fcbd)

Graph with this PR:
![graph_2](https://github.com/user-attachments/assets/1e053d9c-75cc-402b-84df-86229c98277a)

The first commit keeps the re-export, and just changes the dependency if possible. The second commit is the "breaking change" which removes the re-export, and "explicitly" adds the `rustc_attr_data_structures` dependency where needed. It also switches over some src/tools/*.

The second commit is actually a lot more involved than I expected. Please let me know if it's a better idea to back it out and just keep the first commit.
2025-05-19 13:24:54 +10:00
Samuel Tardieu
375c65030b
fix: unnecessary_to_owned FP when map key is a reference (#14834)
Closes rust-lang/rust-clippy#14833

changelog: [`unnecessary_to_owned`] fix FP when map key is a reference
2025-05-18 19:49:20 +00:00
llogiq
b03370b9ce
Add a reason to/remove some //@no-rustfix annotations (#14839)
changelog: none
2025-05-18 18:53:22 +00:00
yanglsh
492c4e197d fix: unnecessary_to_owned FP when map key is a reference 2025-05-19 00:27:53 +08:00