-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Open
Labels
C-bugCategory: Clippy is not doing the correct thingCategory: Clippy is not doing the correct thing
Description
Summary
As title; when clippy --fix is run against code containing an arg-less Foo::new() method with generic type bounds, it flags the new_without_default lint, and attempts to fix by emitting an unbounded Default impl (which fails to typecheck).
Obviously this isn't a huge deal because I can just add the bound myself trivially.
Reproducer
Code:
use std::marker::PhantomData;
pub struct Foo<T> {
marker: PhantomData<T>
}
impl<T> Foo<T> {
pub fn new() -> Self
where T: Clone
{
Self { marker: PhantomData }
}
}
fn main() {
Foo::<u64>::new();
println!("Hello, world!");
}Current output:
➜ clippyprob git:(master) 251218000110> cargo clippy --fix
Checking clippyprob v0.1.0 (/Users/swwu/clippyprob)
warning: failed to automatically apply fixes suggested by rustc to crate `clippyprob`
after fixes were automatically applied the compiler reported errors within these files:
* src/main.rs
This likely indicates a bug in either rustc or cargo itself,
and we would appreciate a bug report! You're likely to see
a number of compiler warnings after this message which cargo
attempted to fix but failed. If you could open an issue at
https://github.com/rust-lang/rust-clippy/issues
quoting the full output of this command we'd be very appreciative!
Note that you may be able to make some more progress in the near-term
fixing code with the `--broken-code` flag
The following errors were reported:
error[E0277]: the trait bound `T: std::clone::Clone` is not satisfied
--> src/main.rs:9:9
|
9 | Self::new()
| ^^^^^^^^^^^ the trait `std::clone::Clone` is not implemented for `T`
|
note: required by a bound in `Foo::<T>::new`
--> src/main.rs:15:18
|
14 | pub fn new() -> Self
| --- required by a bound in this associated function
15 | where T: Clone
| ^^^^^ required by this bound in `Foo::<T>::new`
help: consider restricting type parameter `T` with trait `Clone`
|
7 | impl<T: std::clone::Clone> Default for Foo<T> {
| +++++++++++++++++++
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0277`.
Original diagnostics will follow.
warning: you should consider adding a `Default` implementation for `Foo<T>`
--> src/main.rs:8:5
|
8 | / pub fn new() -> Self
9 | | where T: Clone
10 | | {
11 | | Self { marker: PhantomData }
12 | | }
| |_____^
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.92.0/index.html#new_without_default
= note: `#[warn(clippy::new_without_default)]` on by default
help: try adding this
|
7 + impl<T> Default for Foo<T> {
8 + fn default() -> Self {
9 + Self::new()
10 + }
11 + }
|
warning: `clippyprob` (bin "clippyprob") generated 1 warning (run `cargo clippy --fix --bin "clippyprob" -p clippyprob` to apply 1 suggestion)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.56s
According to --broken-code, clippy attempts to add the following diff:
7 + impl<T> Default for Foo<T> {
8 + fn default() -> Self {
9 + Self::new()
10 + }
11 + }
Desired output:
Clippy fixes it and doesn't exit with compiler errors and a message telling me to open a bug report. Presumably it should be emitting something like this instead:
7 + impl<T> Default for Foo<T> where T: Clone {
8 + fn default() -> Self {
9 + Self::new()
10 + }
11 + }
Version
rustc 1.92.0 (ded5c06cf 2025-12-08)
binary: rustc
commit-hash: ded5c06cf21d2b93bffd5d884aa6e96934ee4234
commit-date: 2025-12-08
host: aarch64-apple-darwin
release: 1.92.0
LLVM version: 21.1.3
Additional Labels
No response
Metadata
Metadata
Assignees
Labels
C-bugCategory: Clippy is not doing the correct thingCategory: Clippy is not doing the correct thing