//@run-rustfix #![allow(unused)] #![warn(clippy::default_constructed_unit_structs)] use std::marker::PhantomData; #[derive(Default)] struct UnitStruct; impl UnitStruct { fn new() -> Self { //should lint Self } } #[derive(Default)] struct TupleStruct(usize); impl TupleStruct { fn new() -> Self { // should not lint Self(Default::default()) } } // no lint for derived impl #[derive(Default)] struct NormalStruct { inner: PhantomData, } struct NonDefaultStruct; impl NonDefaultStruct { fn default() -> Self { Self } } #[derive(Default)] enum SomeEnum { #[default] Unit, Tuple(UnitStruct), Struct { inner: usize, }, } impl NormalStruct { fn new() -> Self { // should lint Self { inner: PhantomData, } } fn new2() -> Self { // should not lint Self { inner: Default::default(), } } } #[derive(Default)] struct GenericStruct { t: T, } impl GenericStruct { fn new() -> Self { // should not lint Self { t: T::default() } } fn new2() -> Self { // should not lint Self { t: Default::default() } } } struct FakeDefault; impl FakeDefault { fn default() -> Self { Self } } impl Default for FakeDefault { fn default() -> Self { Self } } #[derive(Default)] struct EmptyStruct {} #[derive(Default)] #[non_exhaustive] struct NonExhaustiveStruct; fn main() { // should lint let _ = PhantomData::; let _: PhantomData = PhantomData; let _: PhantomData = std::marker::PhantomData; let _ = UnitStruct; // should not lint let _ = TupleStruct::default(); let _ = NormalStruct::default(); let _ = NonExhaustiveStruct::default(); let _ = SomeEnum::default(); let _ = NonDefaultStruct::default(); let _ = EmptyStruct::default(); let _ = FakeDefault::default(); let _ = ::default(); macro_rules! in_macro { ($i:ident) => {{ let _ = UnitStruct::default(); let _ = $i::default(); }}; } in_macro!(UnitStruct); macro_rules! struct_from_macro { () => { UnitStruct }; } let _ = ::default(); }