Skip to content

Detect structs with manual new and automatic derive #14075

@nyurik

Description

@nyurik

What it does

As this bug in rust compiler shows, it is easy to implement a non-trivial new() method, while using #[derive(Default)] -- thus having two different ways to instantiate a struct, most likely creating bugs. I suspect there is a almost no good use case for the fn new() -> Self (without parameters) to contain anything other than { Self::default() }.

Other considerations

Advantage

  • keeps Default and new consistent
  • prevents bugs due to accidental multiple implementations

Drawbacks

There might be some strange usecase for new to be different from default. I couldn't come up with one, but I am sure something could exist...

Example

#[derive(Default)]
struct MyStruct(u32);

impl MyStruct {
  fn new() -> Self { Self(42) }
}

Could be written as:

impl MyStruct {
  fn new() -> Self { Self::default() }
}

Metadata

Metadata

Assignees

Labels

A-lintArea: New lints

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions