about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRyan Levick <ryan.levick@gmail.com>2021-01-05 16:14:39 +0100
committerRyan Levick <me@ryanlevick.com>2021-03-03 11:22:17 +0100
commitf49ed7a6b7aa3a44dd0444b508a1d0ddc09b0f15 (patch)
treec6b01189571ac4abb30d9a37c3c3459407b3dcc8
parent040735c110026bbd494a23c86182ebda201d720b (diff)
downloadrust-f49ed7a6b7aa3a44dd0444b508a1d0ddc09b0f15.tar.gz
rust-f49ed7a6b7aa3a44dd0444b508a1d0ddc09b0f15.zip
Add tests and support two more noop methods
-rw-r--r--compiler/rustc_lint/src/noop_method_call.rs12
-rw-r--r--compiler/rustc_span/src/symbol.rs4
-rw-r--r--library/core/src/borrow.rs1
-rw-r--r--library/core/src/clone.rs3
-rw-r--r--library/core/src/ops/deref.rs1
-rw-r--r--src/test/ui/lint/noop-method-call.rs45
-rw-r--r--src/test/ui/lint/noop-method-call.stderr28
7 files changed, 89 insertions, 5 deletions
diff --git a/compiler/rustc_lint/src/noop_method_call.rs b/compiler/rustc_lint/src/noop_method_call.rs
index 098c50d5abe..3ab3fab4272 100644
--- a/compiler/rustc_lint/src/noop_method_call.rs
+++ b/compiler/rustc_lint/src/noop_method_call.rs
@@ -54,11 +54,19 @@ impl<'tcx> LateLintPass<'tcx> for NoopMethodCall {
                         // Resolve the trait method instance
                         if let Ok(Some(i)) = ty::Instance::resolve(cx.tcx, param_env, did, substs) {
                             // Check that it implements the noop diagnostic
-                            if cx.tcx.is_diagnostic_item(sym::ref_clone_method, i.def_id()) {
+                            tracing::debug!("Resolves to: {:?}", i.def_id());
+                            if [
+                                sym::noop_method_borrow,
+                                sym::noop_method_clone,
+                                sym::noop_method_deref,
+                            ]
+                            .iter()
+                            .any(|s| cx.tcx.is_diagnostic_item(*s, i.def_id()))
+                            {
                                 let span = expr.span;
 
                                 cx.struct_span_lint(NOOP_METHOD_CALL, span, |lint| {
-                                    let message = "Call to noop method";
+                                    let message = "call to noop method";
                                     lint.build(&message).emit()
                                 });
                             }
diff --git a/compiler/rustc_span/src/symbol.rs b/compiler/rustc_span/src/symbol.rs
index 2207deb8fb5..d39fbd61962 100644
--- a/compiler/rustc_span/src/symbol.rs
+++ b/compiler/rustc_span/src/symbol.rs
@@ -789,6 +789,9 @@ symbols! {
         none_error,
         nontemporal_store,
         nontrapping_dash_fptoint: "nontrapping-fptoint",
+        noop_method_borrow,
+        noop_method_clone,
+        noop_method_deref,
         noreturn,
         nostack,
         not,
@@ -915,7 +918,6 @@ symbols! {
         receiver,
         recursion_limit,
         reexport_test_harness_main,
-        ref_clone_method,
         reference,
         reflect,
         reg,
diff --git a/library/core/src/borrow.rs b/library/core/src/borrow.rs
index c9040cd0a16..af2ad12dddf 100644
--- a/library/core/src/borrow.rs
+++ b/library/core/src/borrow.rs
@@ -219,6 +219,7 @@ impl<T: ?Sized> BorrowMut<T> for T {
 
 #[stable(feature = "rust1", since = "1.0.0")]
 impl<T: ?Sized> Borrow<T> for &T {
+    #[rustc_diagnostic_item = "noop_method_borrow"]
     fn borrow(&self) -> &T {
         &**self
     }
diff --git a/library/core/src/clone.rs b/library/core/src/clone.rs
index 12f0f9629a3..12b4feeb14a 100644
--- a/library/core/src/clone.rs
+++ b/library/core/src/clone.rs
@@ -104,7 +104,6 @@
 /// [impls]: #implementors
 #[stable(feature = "rust1", since = "1.0.0")]
 #[lang = "clone"]
-#[rustc_diagnostic_item = "Clone"]
 pub trait Clone: Sized {
     /// Returns a copy of the value.
     ///
@@ -222,7 +221,7 @@ mod impls {
     #[stable(feature = "rust1", since = "1.0.0")]
     impl<T: ?Sized> Clone for &T {
         #[inline]
-        #[rustc_diagnostic_item = "ref_clone_method"]
+        #[rustc_diagnostic_item = "noop_method_clone"]
         fn clone(&self) -> Self {
             *self
         }
diff --git a/library/core/src/ops/deref.rs b/library/core/src/ops/deref.rs
index 2419771eae2..d503a301741 100644
--- a/library/core/src/ops/deref.rs
+++ b/library/core/src/ops/deref.rs
@@ -78,6 +78,7 @@ pub trait Deref {
 impl<T: ?Sized> Deref for &T {
     type Target = T;
 
+    #[rustc_diagnostic_item = "noop_method_deref"]
     fn deref(&self) -> &T {
         *self
     }
diff --git a/src/test/ui/lint/noop-method-call.rs b/src/test/ui/lint/noop-method-call.rs
new file mode 100644
index 00000000000..4b81e04d3f7
--- /dev/null
+++ b/src/test/ui/lint/noop-method-call.rs
@@ -0,0 +1,45 @@
+// check-pass
+
+#![allow(unused)]
+
+use std::borrow::Borrow;
+use std::ops::Deref;
+
+struct Foo<T>(T);
+
+#[derive(Clone)]
+struct Bar<T>(T);
+
+struct DerefExample<T>(T);
+
+impl<T> Deref for DerefExample<T> {
+    type Target = T;
+    fn deref(&self) -> &Self::Target {
+        &self.0
+    }
+}
+
+fn main() {
+    let foo = &Foo(1u32);
+    let foo_clone: &Foo<u32> = foo.clone(); //~ WARNING call to noop method
+
+    let bar = &Bar(1u32);
+    let bar_clone: Bar<u32> = bar.clone();
+
+    let deref = &&DerefExample(12u32);
+    let derefed: &DerefExample<u32> = deref.deref(); //~ WARNING call to noop method
+
+    let deref = &DerefExample(12u32);
+    let derefed: &u32 = deref.deref();
+
+    let a = &&Foo(1u32);
+    let borrowed: &Foo<u32> = a.borrow(); //~ WARNING call to noop method
+}
+
+fn generic<T>(foo: &Foo<T>) {
+    foo.clone();
+}
+
+fn non_generic(foo: &Foo<u32>) {
+    foo.clone(); //~ WARNING call to noop method
+}
diff --git a/src/test/ui/lint/noop-method-call.stderr b/src/test/ui/lint/noop-method-call.stderr
new file mode 100644
index 00000000000..1120adee121
--- /dev/null
+++ b/src/test/ui/lint/noop-method-call.stderr
@@ -0,0 +1,28 @@
+warning: call to noop method
+  --> $DIR/noop-method-call.rs:24:32
+   |
+LL |     let foo_clone: &Foo<u32> = foo.clone();
+   |                                ^^^^^^^^^^^
+   |
+   = note: `#[warn(noop_method_call)]` on by default
+
+warning: call to noop method
+  --> $DIR/noop-method-call.rs:30:39
+   |
+LL |     let derefed: &DerefExample<u32> = deref.deref();
+   |                                       ^^^^^^^^^^^^^
+
+warning: call to noop method
+  --> $DIR/noop-method-call.rs:36:31
+   |
+LL |     let borrowed: &Foo<u32> = a.borrow();
+   |                               ^^^^^^^^^^
+
+warning: call to noop method
+  --> $DIR/noop-method-call.rs:44:5
+   |
+LL |     foo.clone();
+   |     ^^^^^^^^^^^
+
+warning: 4 warnings emitted
+