Commit graph

22214 commits

Author SHA1 Message Date
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
Matthias Krüger
de12d28ce8 Rollup merge of #135706 - compiler-errors:elaborate, r=lcnr
Move `supertrait_def_ids` into the elaborate module like all other fns

It's strange that this is the only elaborate-like fn on tcx.

r? lcnr
2025-01-21 23:30:18 +01:00
bors
d22dcb9cb4 Auto merge of #134299 - RalfJung:remove-start, r=compiler-errors
remove support for the (unstable) #[start] attribute

As explained by `@Noratrieb:`
`#[start]` should be deleted. It's nothing but an accidentally leaked implementation detail that's a not very useful mix between "portable" entrypoint logic and bad abstraction.

I think the way the stable user-facing entrypoint should work (and works today on stable) is pretty simple:
- `std`-using cross-platform programs should use `fn main()`. the compiler, together with `std`, will then ensure that code ends up at `main` (by having a platform-specific entrypoint that gets directed through `lang_start` in `std` to `main` - but that's just an implementation detail)
- `no_std` platform-specific programs should use `#![no_main]` and define their own platform-specific entrypoint symbol with `#[no_mangle]`, like `main`, `_start`, `WinMain` or `my_embedded_platform_wants_to_start_here`. most of them only support a single platform anyways, and need cfg for the different platform's ways of passing arguments or other things *anyways*

`#[start]` is in a super weird position of being neither of those two. It tries to pretend that it's cross-platform, but its signature is  a total lie. Those arguments are just stubbed out to zero on ~~Windows~~ wasm, for example. It also only handles the platform-specific entrypoints for a few platforms that are supported by `std`, like Windows or Unix-likes. `my_embedded_platform_wants_to_start_here` can't use it, and neither could a libc-less Linux program.
So we have an attribute that only works in some cases anyways, that has a signature that's a total lie (and a signature that, as I might want to add, has changed recently, and that I definitely would not be comfortable giving *any* stability guarantees on), and where there's a pretty easy way to get things working without it in the first place.

Note that this feature has **not** been RFCed in the first place.

*This comment was posted [in May](https://github.com/rust-lang/rust/issues/29633#issuecomment-2088596042) and so far nobody spoke up in that issue with a usecase that would require keeping the attribute.*

Closes https://github.com/rust-lang/rust/issues/29633

try-job: x86_64-gnu-nopt
try-job: x86_64-msvc-1
try-job: x86_64-msvc-2
try-job: test-various
2025-01-21 19:46:20 +00:00
Michael Goulet
699296d386 Move supertrait_def_ids into the elaborate module like all other fns 2025-01-21 17:36:57 +00:00
Ralf Jung
759212cd59 remove support for the #[start] attribute 2025-01-21 06:59:15 -07: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
f0b99b2b38 needless_option_take: add autofix 2025-01-20 11:53:08 +01: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
Michael Goulet
2b488c3e51 Get rid of mir::Const::from_ty_const 2025-01-20 04:26:44 +00:00
lapla-cogito
7aae4f462a
auto-fix for redundant_else lint 2025-01-20 08:13:01 +09: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
Samuel Tardieu
51b0107d28 New lint: unnecessary_semicolon 2025-01-19 15:34:07 +01:00
alexey semenyuk
5bd989a46f Update version for unneeded_struct_pattern 2025-01-19 19:31:21 +05:00
Alex Macleod
e692cd4b30
change literal_string_with_formatting_args lint category to nursery (#14014)
This PR changes literal_string_with_formatting_args category from
`suspicious` to `nursery` since there are thousands of false positive on
GitHub.

Closes #13989 since it's no longer problematic with such false positive
with ~~`pedantic`~~ `nursery` category.

changelog: [`literal_string_with_formatting_args` ] change category to
`nursery` from `suspicious`
2025-01-19 11:58:32 +00:00
Samuel Tardieu
27592e3ec8 Make unnecessary_map_or work with ref and Deref
Receivers which are references to `Option` and `Result`, or who
implement `Deref` to one of those types, will be linted as well.
2025-01-19 10:06:21 +01:00
Samuel Tardieu
7f37b2af97 Use clearer multipart suggestions for unnecessary_map_or lint
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.
2025-01-19 10:06:21 +01:00
anatawa12
fbf66310c1
chore: change to nursery instead 2025-01-19 12:38:59 +09:00
Rémy Rakic
e7f1e421b5 Revert "Auto merge of #134330 - scottmcm:no-more-rvalue-len, r=matthewjasper"
This reverts commit e108481f74, reversing
changes made to 303e8bd768.
2025-01-18 22:09:34 +00:00
Alex Macleod
2220806d69
Emit missing_const_for_fn for CONST_MUT_REFS (#13839)
1.83 stabilized `CONST_MUT_REFS`, also allowing for `const fn` to mutate
through mutable references. This ensures `missing_const_for_fn` is
emitted for those cases.

changelog: [`missing_const_for_fn`]: Now suggests marking some functions
taking mutable references `const`
2025-01-18 17:52:49 +00:00
Timo
38828bf89a
Fix typo in check_clousure function name (#14025)
I noticed this because I failed to find this `check_closure` by
grepping.

changelog: none
2025-01-18 17:32:30 +00:00
Guillaume Gomez
277bf089b3 Fix regression #14007 2025-01-18 17:14:01 +01:00
Samuel Tardieu
a487c601a4 Fix typo in check_clousure function name 2025-01-18 16:08:42 +01:00
Thomas Churchman
f327640706 Emit missing_const_for_fn for CONST_MUT_REFS 2025-01-18 13:31:04 +01:00
Samuel Tardieu
19ddb6922c Handle more cases in is_normalizable
By assuming that a recursive type is normalizable within the deeper
calls to `is_normalizable_helper()`, more cases can be handled by this
function.

In order to fix stack overflows, a recursion limit has also been added
for recursive generic type instantiations.
2025-01-18 05:43:07 +01:00
Samuel Tardieu
76bc88c40f More tests for large_enum_variant 2025-01-18 05:43:07 +01:00
llogiq
10045db878
Update doc wildcard_dependencies (#13810)
Currently
https://rust-lang.github.io/rust-clippy/master/index.html#wildcard_dependencies
doc doesn't contain explanation how it should be so added more details

----

changelog: none
2025-01-17 21:30:54 +00:00
alexey semenyuk
3f4aa9bf6e Update doc wildcard_dependencies 2025-01-18 01:20:22 +05:00
Vishruth-Thimmaiah
23e602cd94
fix: correct suggestion for significant_drop_in_scrutinee in expressions
fixes: #13986
2025-01-17 23:54:42 +05:30
Alejandra González
e359e88088
fix version search in the website (#14016)
fix #14015

changelog: none
2025-01-17 13:59:58 +00:00
lapla-cogito
e307b2f0c6
fix version search in the website 2025-01-17 18:16:40 +09:00
anatawa12
ee522d8d15
change literal_string_with_formatting_args lint to pedantic 2025-01-17 15:37:48 +09:00
Samuel Tardieu
bbd58d19d4 Do not trigger [size_of_in_element_count] for u8
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.
2025-01-17 00:43:36 +01:00
Samuel Tardieu
3921ed67b2 [path_buf_push_overwrite]: mark suggestion as MaybeIncorrect
Proposing to replace

```rust
let mut x = PathBuf::from("/foo");
x.push("/bar");
```

by

```rust
let mut x = PathBuf::from("/foo");
x.push("bar");
```

changes the content of `x` (`/bar` ⇒ `/foo/bar`).
2025-01-16 18:16:29 +01:00
Samuel Tardieu
ded9354dcf Suggest using Vec::extend() in same_item_push
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.
2025-01-15 22:50:25 +01:00
Fridtjof Stoldt
8d0c0eb917
Pause assignments for @xFrednet (#14005)
I'll take a short break from auto assignments. My last few weeks have
been busy and I feel like getting my inbox back in order and taking a
short breather will be the best for me.

I still plan to review the PRs I'm currently assigned to and writing the
changelogs.

Jup that's it, have a good day, who ever is reading this =^.^=

changelog: none
2025-01-15 20:16:41 +00:00
xFrednet
7485970298
Pause assignments for @xFrednet 2025-01-15 21:08:43 +01:00
Guillaume Gomez
e35330cabe Use is_from_proc_macro instead of checking if the snippet contains the literal 2025-01-15 16:56:07 +01:00
Guillaume Gomez
00104a4167 Add more detailed explanations for #13885 regression test 2025-01-15 16:42:56 +01:00
Guillaume Gomez
e31493b9b8 Rollup merge of #135003 - RalfJung:deprecate-allowed-through-unstable, r=davidtwco
deprecate `std::intrinsics::transmute` etc, use `std::mem::*` instead

The `rustc_allowed_through_unstable_modules` attribute lets users call `std::mem::transmute` as `std::intrinsics::transmute`. The former is a reexport of the latter, and for a long time we didn't properly check stability for reexports, so making this a hard error now would be a breaking change for little gain. But at the same time, `std::intrinsics::transmute` is not the intended path for this function, so I think it is a good idea to show a deprecation warning when that path is used. This PR implements that, for all the functions in `std::intrinsics` that carry the attribute.

I assume this will need ``@rust-lang/libs-api`` FCP.
2025-01-15 16:30:11 +01:00
bors
f6df26682e Auto merge of #134353 - oli-obk:safe-target-feature-unsafe-by-default, r=wesleywiser
Treat safe target_feature functions as unsafe by default [less invasive variant]

This unblocks
* #134090

As I stated in https://github.com/rust-lang/rust/pull/134090#issuecomment-2541332415 I think the previous impl was too easy to get wrong, as by default it treated safe target feature functions as safe and had to add additional checks for when they weren't. Now the logic is inverted. By default they are unsafe and you have to explicitly handle safe target feature functions.

This is the less (imo) invasive variant of #134317, as it doesn't require changing the Safety enum, so it only affects FnDefs and nothing else, as it should.
2025-01-15 12:06:56 +00:00