]> git.lizzy.rs Git - rust.git/commitdiff
new_ret_no_self corrected panic and added test stderr
authorJosh Mcguigan <joshmcg88@gmail.com>
Wed, 3 Oct 2018 10:55:31 +0000 (03:55 -0700)
committerJosh Mcguigan <joshmcg88@gmail.com>
Sat, 13 Oct 2018 13:20:39 +0000 (06:20 -0700)
clippy_lints/src/methods/mod.rs
tests/ui/new_ret_no_self.rs
tests/ui/new_ret_no_self.stderr [new file with mode: 0644]

index d11dbf0e773c8b7fbb46d726cff28858235acdc5..81cb1cd1182864b328cc1be905fb2a7bf4430e6a 100644 (file)
@@ -931,13 +931,15 @@ fn check_impl_item(&mut self, cx: &LateContext<'a, 'tcx>, implitem: &'tcx hir::I
             }
         }
 
-        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`");
+            }
         }
     }
 }
index 67933f0026297b9ed1849adf20aec9c1f33c5ca4..762dd582168561dab0662ae299366f26580bd001 100644 (file)
@@ -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;
 
diff --git a/tests/ui/new_ret_no_self.stderr b/tests/ui/new_ret_no_self.stderr
new file mode 100644 (file)
index 0000000..1d69889
--- /dev/null
@@ -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
+