// run-rustfix #![allow(dead_code)] fn duplicate_t<T: Copy>(t: T) -> (T, T) { //~^ HELP consider restricting type parameter `T` (t, t) //~ use of moved value: `t` } fn duplicate_opt<T: Copy>(t: Option<T>) -> (Option<T>, Option<T>) { //~^ HELP consider restricting type parameter `T` (t, t) //~ use of moved value: `t` } fn duplicate_tup1<T: Copy>(t: (T,)) -> ((T,), (T,)) { //~^ HELP consider restricting type parameter `T` (t, t) //~ use of moved value: `t` } fn duplicate_tup2<A: Copy, B: Copy>(t: (A, B)) -> ((A, B), (A, B)) { //~^ HELP consider restricting type parameters (t, t) //~ use of moved value: `t` } fn duplicate_custom<T: Copy + Trait>(t: S<T>) -> (S<T>, S<T>) { //~^ HELP consider restricting type parameter `T` (t, t) //~ use of moved value: `t` } struct S<T>(T); trait Trait {} impl<T: Trait + Clone> Clone for S<T> { fn clone(&self) -> Self { Self(self.0.clone()) } } impl<T: Trait + Copy> Copy for S<T> {} trait A {} trait B {} // Test where bounds are added with different bound placements fn duplicate_custom_1<T: Copy + Trait>(t: S<T>) -> (S<T>, S<T>) where { //~^ HELP consider restricting type parameter `T` (t, t) //~ use of moved value: `t` } fn duplicate_custom_2<T>(t: S<T>) -> (S<T>, S<T>) where T: A + Copy + Trait, //~^ HELP consider further restricting this bound { (t, t) //~ use of moved value: `t` } fn duplicate_custom_3<T>(t: S<T>) -> (S<T>, S<T>) where T: A + Copy + Trait, //~^ HELP consider further restricting this bound T: B, { (t, t) //~ use of moved value: `t` } fn duplicate_custom_4<T: A + Copy + Trait>(t: S<T>) -> (S<T>, S<T>) //~^ HELP consider further restricting this bound where T: B, { (t, t) //~ use of moved value: `t` } #[rustfmt::skip] fn existing_colon<T: Copy>(t: T) { //~^ HELP consider restricting type parameter `T` [t, t]; //~ use of moved value: `t` } fn existing_colon_in_where<T>(t: T) where T:, T: Copy //~^ HELP consider further restricting type parameter `T` { [t, t]; //~ use of moved value: `t` } fn main() {}