Commit graph

22214 commits

Author SHA1 Message Date
Lzu Tao
925718d8eb Make the "expensive" comment belong to a branch 2025-02-06 14:31:39 +07:00
Lzu Tao
83b97ae713 Use clippy_utils::ty::ty_from_hir_ty to avoid ICE 2025-02-06 14:31:39 +07:00
Lzu Tao
daab21ef9d Pulicize clippy_utils::ty::ty_from_hir_ty
And use it in the next commit to avoid ICE.
2025-02-06 14:31:39 +07:00
lapla-cogito
5f6dd7a8eb
remove an outdated line 2025-02-06 12:47:47 +09:00
Alejandra González
f09701ab6a
Do not trigger [size_of_in_element_count] for u8 (#14011)
Counting in bytes for a pointer to `u8` is legitimate and must not
trigger the lint. Also, this prevents linting the
`{std,core}::ptr::write_bytes` as it manipulates bytes.

Fix #6590

changelog: [`size_of_in_element_count`]: do not lint if the pointee type
is `u8`
2025-02-05 22:17:10 +00:00
Alexey Semenyuk
c718ae8e2d Add Nursery and Deprecated lints section at Book 2025-02-05 23:09:08 +05:00
Alex Macleod
390286d664
Update version for unneeded_struct_pattern (#14031)
This lint was merged recently
https://github.com/rust-lang/rust-clippy/pull/13465 and should go with
the next version 1.86.0 https://github.com/rust-lang/rust-clippy/tags

changelog: none
2025-02-05 13:55:22 +00:00
Oli Scherer
f3e292da0b Uniformly handle HIR literals in visitors and lints 2025-02-05 11:28:24 +00:00
Yutaro Ohno
44fda914d3 Correct version of doc_overindented_list_items 2025-02-05 19:16:50 +09:00
lapla-cogito
60f9445900
don't emit lint inside macro in manual_async_fn 2025-02-05 15:06:35 +09:00
llogiq
e6d9641272
fix: manual_unwrap_or_default suggests falsely when condition type is uncertain (#13889)
fixes #12670

Continuation of #12688. r? @Jarcho if you don't mind?

changelog: [`manual_unwrap_or_default`] fix wrong suggestions when
condition type is uncertain
2025-02-05 06:05:58 +00:00
León Orell Valerian Liehr
4c11087e51 Rollup merge of #128045 - pnkfelix:rustc-contracts, r=oli-obk
#[contracts::requires(...)]  + #[contracts::ensures(...)]

cc https://github.com/rust-lang/rust/issues/128044

Updated contract support: attribute syntax for preconditions and postconditions, implemented via a series of desugarings  that culminates in:
1. a compile-time flag (`-Z contract-checks`) that, similar to `-Z ub-checks`, attempts to ensure that the decision of enabling/disabling contract checks is delayed until the end user program is compiled,
2. invocations of lang-items that handle invoking the precondition,  building a checker for the post-condition, and invoking that post-condition checker at the return sites for the function, and
3. intrinsics for the actual evaluation of pre- and post-condition predicates that third-party verification tools can intercept and reinterpret for their own purposes (e.g. creating shims of behavior that abstract away the function body and replace it solely with the pre- and post-conditions).

Known issues:

 * My original intent, as described in the MCP (https://github.com/rust-lang/compiler-team/issues/759) was   to have a rustc-prefixed attribute namespace (like   rustc_contracts::requires). But I could not get things working when I tried   to do rewriting via a rustc-prefixed builtin attribute-macro. So for now it  is called `contracts::requires`.

 * Our attribute macro machinery does not provide direct support for attribute arguments that are parsed like rust expressions. I spent some time trying to add that (e.g. something that would parse the attribute arguments as an AST while treating the remainder of the items as a token-tree), but its too big a lift for me to undertake. So instead I hacked in something approximating that goal, by semi-trivially desugaring the token-tree attribute contents into internal AST constucts. This may be too fragile for the long-term.
   * (In particular, it *definitely* breaks when you try to add a contract to a function like this: `fn foo1(x: i32) -> S<{ 23 }> { ... }`, because its token-tree based search for where to inject the internal AST constructs cannot immediately see that the `{ 23 }` is within a generics list. I think we can live for this for the short-term, i.e. land the work, and continue working on it while in parallel adding a new attribute variant that takes a token-tree attribute alongside an AST annotation, which would completely resolve the issue here.)

* the *intent* of `-Z contract-checks` is that it behaves like `-Z ub-checks`, in that we do not prematurely commit to including or excluding the contract evaluation in upstream crates (most notably, `core` and `std`). But the current test suite does not actually *check* that this is the case. Ideally the test suite would be extended with a multi-crate test that explores the matrix of enabling/disabling contracts on both the upstream lib and final ("leaf") bin crates.
2025-02-05 05:03:01 +01:00
J-ZhengLi
2a4be5365a move expr_requires_coercion to clippy_utils & some other adjustments 2025-02-05 10:26:17 +08:00
yanglsh
270e52f6da fix: manual_unwrap_or_default 2025-02-04 19:23:03 -07:00
J-ZhengLi
a2f9861df8 fix [manual_map] not catching type adjustment 2025-02-05 10:18:13 +08:00
Michael Howell
c012693961 needless_collect: avoid warning if non-iterator methods are used
It can make sense to `collect()` an iterator and then immediately
iterate over it if the iterator has special methods that you need.
For example, the Map iterator doesn't implement Clone, but the
collection iterator might. Or the collection iterator might
support slicing.
2025-02-04 13:07:06 -07:00
Jason Newcomb
75e3a2e905
Move mutex_integer to restriction and improve mutex_{integer,atomic} docs (#14110)
Similar to https://github.com/rust-lang/rust-clippy/pull/10115 (for
`mutex_atomic`), but for `mutex_integer`.

This also improve docs of `mutex_integer`/`mutex_atomic` (extend known
problems section to mention condvar issue
(https://github.com/rust-lang/rust-clippy/issues/1516) and portability
issue).

changelog: Moved [`mutex_integer`] to `restriction`
2025-02-04 10:44:57 +00:00
lapla-cogito
4220dbd4b3
allow assign_op_pattern in the test of string_add 2025-02-04 12:19:04 +09:00
Samuel Tardieu
64dec0760e Simplify reindent_multiline() signature
- `reindent_multiline()` always returns the result of
  `reindent_multiline_inner()` which returns a `String`. Make
  `reindent_multiline()` return a `String` as well, instead of a
  systematically owned `Cow<'_, str>`.
- There is no reason for `reindent_multiline()` to force a caller to
  build a `Cow<'_, str>` instead of passing a `&str` directly,
  especially considering that a `String` will always be returned.

Also, both the input parameter and return value (of type `Cow<'_, str>`)
shared the same (elided) lifetime for no reason: this worked only because
the result was always the `Cow::Owned` variant which is compatible with
any lifetime.

As a consequence, the signature changes from:

```rust
fn reindent_multiline(s: Cow<'_, str>, …) -> Cow<'_, str> { … }
```

to

```rust
fn reindent_multiline(s: &str, …) -> String { … }
```
2025-02-03 23:47:08 +01:00
Alejandra González
c5218d509b
new manual_option_as_slice lint (#13901)
Hey folks. It's been a while since I added the `as_slice` method to
`Option`, and I totally forgot about a lint to suggest it. Well, I had
some time around Christmas, so here it is now.

---

changelog: add [`manual_option_as_slice`] lint
2025-02-03 22:00:38 +00:00
Celina G. Val
0a8331f681 Express contracts as part of function header and lower it to the contract lang items
includes post-developed commit: do not suggest internal-only keywords as corrections to parse failures.

includes post-developed commit: removed tabs that creeped in into rustfmt tool source code.

includes post-developed commit, placating rustfmt self dogfooding.

includes post-developed commit: add backquotes to prevent markdown checking from trying to treat an attr as a markdown hyperlink/

includes post-developed commit: fix lowering to keep contracts from being erroneously inherited by nested bodies (like closures).

Rebase Conflicts:
 - compiler/rustc_parse/src/parser/diagnostics.rs
 - compiler/rustc_parse/src/parser/item.rs
 - compiler/rustc_span/src/hygiene.rs

Remove contracts keywords from diagnostic messages
2025-02-03 12:54:00 -08:00
Felix S. Klock II
1112801251 Contracts core intrinsics.
These are hooks to:

  1. control whether contract checks are run
  2. allow 3rd party tools to intercept and reintepret the results of running contracts.
2025-02-03 12:53:57 -08:00
Askar Safin
5884fd0325 tree-wide: parallel: Fully removed all Lrc, replaced with Arc 2025-02-03 13:25:57 +03:00
Oli Scherer
c1e4249e0d Use a different hir type for patterns in pattern types than we use in match patterns 2025-02-03 08:18:30 +00:00
llogiq
2c51951dba
add manual_slice_fill lint (#14082)
close #13856

changelog: [`manual_slice_fill`]: new lint
2025-02-03 05:03:14 +00:00
lapla-cogito
07ede9c027
ignore manual_slice_fill in other test files 2025-02-03 10:09:40 +09:00
lapla-cogito
e82b1f4653
add manual_slice_fill lint 2025-02-03 10:09:39 +09:00
lapla-cogito
3d6e090b31
add SLICE_FILL to msrv 2025-02-03 10:09:33 +09:00
Matthias Krüger
1a8e9b9917 Rollup merge of #136445 - bjorn3:diag_ctxt_cleanup, r=oli-obk
Couple of cleanups to DiagCtxt and EarlyDiagCtxt
2025-02-02 23:06:57 +01:00
Matthias Krüger
f8d702bf2d Rollup merge of #136422 - nnethercote:convert-lint-functions, r=Noratrieb
Convert two `rustc_middle::lint` functions to `Span` methods.

`rustc_middle` is a huge crate and it's always good to move stuff out of it. There are lots of similar methods already on `Span`, so these two functions, `in_external_macro` and `is_from_async_await`, fit right in. The diff is big because `in_external_macro` is used a lot by clippy lints.

r? ``@Noratrieb``
2025-02-02 18:05:24 +01:00
bjorn3
abdee777c2 Some cleanups around EarlyDiagCtxt
All callers of EarlyDiagCtxt::early_error now emit a fatal error.
2025-02-02 16:06:43 +00:00
Alex Macleod
6d1482cd5a
Implement --perf flag to lintcheck for benchmarking (#14116)
Turns out I was completely overcomplicating myself,
there was no need for an external tool such as becnhv2
or even the original becnh, we already had the benchmarking
infrastructure right under our noses!

This PR implements a new **lintcheck** option called
--perf, using it as a flag will mean that lintcheck
builds Clippy as a release package and hooks perf to it.

The realization that lintcheck is already 90% of what
a benchmarking tool needs came to me in a dream ☁️

changelog:none
2025-02-02 16:00:20 +00:00
llogiq
0d3fd98892
remove "Known problems" of verbose_bit_mask (#14137)
changelog: none
2025-02-02 15:25:10 +00:00
lapla-cogito
af18dce76b
remove "Known problems" of verbose_bit_mask 2025-02-03 00:12:07 +09:00
lapla-cogito
a5329bd8d3
autofix for range_zip_with_len 2025-02-02 23:44:22 +09:00
Matthias Krüger
56b5d11240 Rollup merge of #136279 - Zalathar:ensure-ok, r=oli-obk
Rename `tcx.ensure()` to `tcx.ensure_ok()`, and improve the associated docs

This is all based on my archaeology for https://rust-lang.zulipchat.com/#narrow/channel/182449-t-compiler.2Fhelp/topic/.60TyCtxtEnsure.60.

The main renamings are:
- `tcx.ensure()` → `tcx.ensure_ok()`
- `tcx.ensure_with_value()` → `tcx.ensure_done()`
- Query modifier `ensure_forwards_result_if_red` → `return_result_from_ensure_ok`

Hopefully these new names are a better fit for the *actual* function and purpose of these query call modes.
2025-02-02 12:31:55 +01:00
Nicholas Nethercote
d30f045fce Convert two rustc_middle::lint functions to Span methods.
`rustc_middle` is a huge crate and it's always good to move stuff out of
it. There are lots of similar methods already on `Span`, so these two
functions, `in_external_macro` and `is_from_async_await`, fit right in.
The diff is big because `in_external_macro` is used a lot by clippy
lints.
2025-02-02 13:57:34 +11:00
Alex Macleod
b8d0b16096
autofix for cmp_null (#14122)
changelog: [`cmp_null`]: add autofix
2025-02-01 22:59:06 +00:00
lapla-cogito
3155dabeaa
add autofix for cmp_null 2025-02-02 04:22:19 +09:00
Alejandra González
c607f78f34
Fix expand/collapse all on site, make highlightjs lazier (#14038)
This fixes the buttons that expand/collapse all the lints in the list,
it also makes code block syntax highlighting only happen when the
specific lint enters the viewport since highlighting them all at once
was fairly heavy

There's also a few miscellaneous inline event handler removals

`script.js` and highlightjs are now loaded with `defer` so that the
download can start earlier

Also fixes https://github.com/rust-lang/rust-clippy/issues/14048, we
were calling highlight on the `pre` in `<pre><code>...</code></pre>` but
highlightjs wants us to call it on the `code` element

changelog: none
2025-02-01 19:02:22 +00:00
alexey semenyuk
2a7d1d4c0b
Remove Known problems section invalid_upcast_comparisons 2025-02-01 23:52:12 +05:00
Matthias Krüger
984cc68c1c Rollup merge of #130514 - compiler-errors:unsafe-binders, r=oli-obk
Implement MIR lowering for unsafe binders

This is the final bit of the unsafe binders puzzle. It implements MIR, CTFE, and codegen for unsafe binders, and enforces that (for now) they are `Copy`. Later on, I'll introduce a new trait that relaxes this requirement to being "is `Copy` or `ManuallyDrop<T>`" which more closely models how we treat union fields.

Namely, wrapping unsafe binders is now `Rvalue::WrapUnsafeBinder`, which acts much like an `Rvalue::Aggregate`. Unwrapping unsafe binders are implemented as a MIR projection `ProjectionElem::UnwrapUnsafeBinder`, which acts much like `ProjectionElem::Field`.

Tracking:
- https://github.com/rust-lang/rust/issues/130516
2025-02-01 16:41:03 +01:00
Manish Goregaokar
7e5cfbe373
Use a better message for toplevel_ref_arg lint (#14132)
A `ref` pattern applied to an argument is not ignored. It creates a
reference as expected, but still requires the function to take ownership
of the argument given to it.

Fix #14131

changelog: [`toplevel_ref_arg`]: use a clearer lint message
2025-02-01 14:13:06 +00:00
Samuel Tardieu
7848488e26 Use a better message for toplevel_ref_arg lint
A `ref` pattern applied to an argument is not ignored. It creates a
reference as expected, but still requires the function to take ownership
of the argument given to it.
2025-02-01 14:23:31 +01:00
lapla-cogito
f9669e4caf
add MSRV check for lines_filter_map_ok 2025-02-01 15:20:34 +09:00
lapla-cogito
2a52fbe5da
add MSRV check for repeat_vec_with_capacity 2025-02-01 12:42:39 +09:00
Zalathar
64fcb00308 Rename tcx.ensure() to tcx.ensure_ok() 2025-02-01 12:38:54 +11:00
Pavel Grigorenko
58d4834097 Resolve projections during internal mutability analysis 2025-02-01 02:30:50 +03:00
Michael Goulet
a9434c08e2 Enforce unsafe binders must be Copy (for now) 2025-01-31 17:40:28 +00:00
Michael Goulet
62c68e15b8 Implement MIR, CTFE, and codegen for unsafe binders 2025-01-31 17:19:53 +00:00