Skip to content

Commit

Permalink
new_ret_no_self corrected panic and added test stderr
Browse files Browse the repository at this point in the history
  • Loading branch information
JoshMcguigan committed Oct 13, 2018
1 parent eb854b2 commit 13ce96c
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 45 deletions.
16 changes: 9 additions & 7 deletions clippy_lints/src/methods/mod.rs
Expand Up @@ -931,13 +931,15 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for Pass {
}
}

let ret_ty = return_ty(cx, implitem.id);
if name == "new" &&
!ret_ty.walk().any(|t| same_tys(cx, t, ty)) {
span_lint(cx,
NEW_RET_NO_SELF,
implitem.span,
"methods called `new` usually return `Self`");
if let hir::ImplItemKind::Method(ref sig, id) = implitem.node {
let ret_ty = return_ty(cx, implitem.id);
if name == "new" &&
!ret_ty.walk().any(|t| same_tys(cx, t, ty)) {
span_lint(cx,
NEW_RET_NO_SELF,
implitem.span,
"methods called `new` usually return `Self`");
}
}
}
}
Expand Down
76 changes: 38 additions & 38 deletions tests/ui/new_ret_no_self.rs
Expand Up @@ -5,44 +5,44 @@

fn main(){}

//trait R {
// type Item;
//}
//
//struct S;
//
//impl R for S {
// type Item = Self;
//}
//
//impl S {
// // should not trigger the lint
// pub fn new() -> impl R<Item = Self> {
// S
// }
//}
//
//struct S2;
//
//impl R for S2 {
// type Item = Self;
//}
//
//impl S2 {
// // should not trigger the lint
// pub fn new(_: String) -> impl R<Item = Self> {
// S2
// }
//}
//
//struct T;
//
//impl T {
// // should not trigger lint
// pub fn new() -> Self {
// unimplemented!();
// }
//}
trait R {
type Item;
}

struct S;

impl R for S {
type Item = Self;
}

impl S {
// should not trigger the lint
pub fn new() -> impl R<Item = Self> {
S
}
}

struct S2;

impl R for S2 {
type Item = Self;
}

impl S2 {
// should not trigger the lint
pub fn new(_: String) -> impl R<Item = Self> {
S2
}
}

struct T;

impl T {
// should not trigger lint
pub fn new() -> Self {
unimplemented!();
}
}

struct U;

Expand Down
18 changes: 18 additions & 0 deletions tests/ui/new_ret_no_self.stderr
@@ -0,0 +1,18 @@
error: methods called `new` usually return `Self`
--> $DIR/new_ret_no_self.rs:51:5
|
51 | / pub fn new() -> u32 {
52 | | unimplemented!();
53 | | }
| |_____^

error: methods called `new` usually return `Self`
--> $DIR/new_ret_no_self.rs:60:5
|
60 | / pub fn new(_: String) -> u32 {
61 | | unimplemented!();
62 | | }
| |_____^

error: aborting due to 2 previous errors

0 comments on commit 13ce96c

Please sign in to comment.