]> git.proxmox.com Git - rustc.git/blobdiff - src/tools/clippy/tests/ui/needless_pass_by_value.rs
New upstream version 1.23.0+dfsg1
[rustc.git] / src / tools / clippy / tests / ui / needless_pass_by_value.rs
index ea97e875ff73235a296e782694729b8e231f7ee3..84c7e8329513af3a991d914319c63f29e142c846 100644 (file)
@@ -1,9 +1,12 @@
-#![feature(plugin)]
-#![plugin(clippy)]
+
+
 
 #![warn(needless_pass_by_value)]
 #![allow(dead_code, single_match, if_let_redundant_pattern_matching, many_single_char_names)]
 
+use std::borrow::Borrow;
+use std::convert::AsRef;
+
 // `v` should be warned
 // `w`, `x` and `y` are allowed (moved or mutated)
 fn foo<T: Default>(v: Vec<T>, w: Vec<T>, mut x: Vec<T>, y: Vec<T>) -> Vec<T> {
@@ -25,10 +28,11 @@ fn bar(x: String, y: Wrapper) {
     assert_eq!(y.0.len(), 42);
 }
 
-// U implements `Borrow<U>`, but should be warned correctly
-fn test_borrow_trait<T: std::borrow::Borrow<str>, U>(t: T, u: U) {
+// V implements `Borrow<V>`, but should be warned correctly
+fn test_borrow_trait<T: Borrow<str>, U: AsRef<str>, V>(t: T, u: U, v: V) {
     println!("{}", t.borrow());
-    consume(&u);
+    println!("{}", u.as_ref());
+    consume(&v);
 }
 
 // ok
@@ -59,4 +63,51 @@ fn test_destructure(x: Wrapper, y: Wrapper, z: Wrapper) {
     println!("{}", t);
 }
 
+trait Foo {}
+
+// `S: Serialize` is allowed to be passed by value, since a caller can pass `&S` instead
+trait Serialize {}
+impl<'a, T> Serialize for &'a T where T: Serialize {}
+impl Serialize for i32 {}
+
+fn test_blanket_ref<T: Foo, S: Serialize>(_foo: T, _serializable: S) {}
+
+fn issue_2114(s: String, t: String, u: Vec<i32>, v: Vec<i32>) {
+    s.capacity();
+    let _ = t.clone();
+    u.capacity();
+    let _ = v.clone();
+}
+
+struct S<T, U>(T, U);
+
+impl<T: Serialize, U> S<T, U> {
+    fn foo(
+        self, // taking `self` by value is always allowed
+        s: String,
+        t: String,
+    ) -> usize {
+        s.len() + t.capacity()
+    }
+
+    fn bar(
+        _t: T, // Ok, since `&T: Serialize` too
+    ) {
+    }
+
+    fn baz(
+        &self,
+        _u: U,
+        _s: Self,
+    ) {
+    }
+}
+
+trait FalsePositive {
+    fn visit_str(s: &str);
+    fn visit_string(s: String) {
+        Self::visit_str(&s);
+    }
+}
+
 fn main() {}