1 #![warn(clippy::needless_pass_by_value)]
5 clippy::redundant_pattern_matching,
6 clippy::many_single_char_names,
10 use std::borrow::Borrow;
11 use std::collections::HashSet;
12 use std::convert::AsRef;
14 // `v` should be warned
15 // `w`, `x` and `y` are allowed (moved or mutated)
16 fn foo<T: Default>(v: Vec<T>, w: Vec<T>, mut x: Vec<T>, y: Vec<T>) -> Vec<T> {
17 assert_eq!(v.len(), 42);
26 fn consume<T>(_: T) {}
28 struct Wrapper(String);
30 fn bar(x: String, y: Wrapper) {
31 assert_eq!(x.len(), 42);
32 assert_eq!(y.0.len(), 42);
35 // V implements `Borrow<V>`, but should be warned correctly
36 fn test_borrow_trait<T: Borrow<str>, U: AsRef<str>, V>(t: T, u: U, v: V) {
37 println!("{}", t.borrow());
38 println!("{}", u.as_ref());
43 fn test_fn<F: Fn(i32) -> i32>(f: F) {
47 // x should be warned, but y is ok
48 fn test_match(x: Option<Option<String>>, y: Option<Option<String>>) {
50 Some(Some(_)) => 1, // not moved
55 Some(Some(s)) => consume(s), // moved
60 // x and y should be warned, but z is ok
61 fn test_destructure(x: Wrapper, y: Wrapper, z: Wrapper) {
62 let Wrapper(s) = z; // moved
63 let Wrapper(ref t) = y; // not moved
64 let Wrapper(_) = y; // still not moved
66 assert_eq!(x.0.len(), s.len());
72 // `S: Serialize` is allowed to be passed by value, since a caller can pass `&S` instead
74 impl<'a, T> Serialize for &'a T where T: Serialize {}
75 impl Serialize for i32 {}
77 fn test_blanket_ref<T: Foo, S: Serialize>(_foo: T, _serializable: S) {}
79 fn issue_2114(s: String, t: String, u: Vec<i32>, v: Vec<i32>) {
88 impl<T: Serialize, U> S<T, U> {
91 // taking `self` by value is always allowed
95 s.len() + t.capacity()
98 fn bar(_t: T, // Ok, since `&T: Serialize` too
102 fn baz(&self, _u: U, _s: Self) {}
105 trait FalsePositive {
106 fn visit_str(s: &str);
107 fn visit_string(s: String) {
112 // shouldn't warn on extern funcs
113 extern "C" fn ext(x: String) -> usize {
117 // whitelist RangeArgument
118 fn range<T: ::std::ops::RangeBounds<usize>>(range: T) {
119 let _ = range.start_bound();
122 struct CopyWrapper(u32);
124 fn bar_copy(x: u32, y: CopyWrapper) {
129 // x and y should be warned, but z is ok
130 fn test_destructure_copy(x: CopyWrapper, y: CopyWrapper, z: CopyWrapper) {
131 let CopyWrapper(s) = z; // moved
132 let CopyWrapper(ref t) = y; // not moved
133 let CopyWrapper(_) = y; // still not moved
139 // The following 3 lines should not cause an ICE. See #2831
141 impl<'b, T> Bar<'b, T> for T {}
142 fn some_fun<'b, S: Bar<'b, ()>>(_item: S) {}
144 // Also this should not cause an ICE. See #2831
146 impl<T> Club<'static, T> for T {}
147 fn more_fun(_item: impl Club<'static, i32>) {}
156 // This should not cause an ICE either
157 // https://github.com/rust-lang/rust-clippy/issues/3144
158 is_sync(HashSet::<usize>::new());