Ignore new-without-default lint when new method has generic types

There may be no sensible `Default` impl if the result of `new` depends
on a type parameter.
This commit is contained in:
scott-linder 2017-06-14 12:50:19 -04:00
parent 7056018335
commit 1ce3cbf9c4
2 changed files with 12 additions and 0 deletions

View File

@ -108,6 +108,11 @@ fn check_fn(
// can't be implemented by default
return;
}
if !sig.generics.ty_params.is_empty() {
// when the result of `new()` depends on a type parameter we should not require an
// impl of `Default`
return;
}
if decl.inputs.is_empty() && name == "new" && cx.access_levels.is_reachable(id) {
let self_ty = cx.tcx
.type_of(cx.tcx.hir.local_def_id(cx.tcx.hir.get_parent(id)));

View File

@ -76,4 +76,11 @@ fn new() -> Private { unimplemented!() } // We don't lint private items
impl Const {
pub const fn new() -> Const { Const } // const fns can't be implemented via Default
}
pub struct IgnoreGenericNew;
impl IgnoreGenericNew {
pub fn new<T>() -> Self { IgnoreGenericNew } // the derived Default does not make sense here as the result depends on T
}
fn main() {}