]> git.lizzy.rs Git - rust.git/blob - tests/ui/unnecessary_clone.rs
Auto merge of #3645 - phansch:remove_copyright_headers, r=oli-obk
[rust.git] / tests / ui / unnecessary_clone.rs
1 #![warn(clippy::clone_on_ref_ptr)]
2 #![allow(unused)]
3
4 use std::cell::RefCell;
5 use std::collections::HashSet;
6 use std::collections::VecDeque;
7 use std::rc::{self, Rc};
8 use std::sync::{self, Arc};
9
10 trait SomeTrait {}
11 struct SomeImpl;
12 impl SomeTrait for SomeImpl {}
13
14 fn main() {}
15
16 fn clone_on_copy() {
17     42.clone();
18
19     vec![1].clone(); // ok, not a Copy type
20     Some(vec![1]).clone(); // ok, not a Copy type
21     (&42).clone();
22
23     let rc = RefCell::new(0);
24     rc.borrow().clone();
25 }
26
27 fn clone_on_ref_ptr() {
28     let rc = Rc::new(true);
29     let arc = Arc::new(true);
30
31     let rcweak = Rc::downgrade(&rc);
32     let arc_weak = Arc::downgrade(&arc);
33
34     rc.clone();
35     Rc::clone(&rc);
36
37     arc.clone();
38     Arc::clone(&arc);
39
40     rcweak.clone();
41     rc::Weak::clone(&rcweak);
42
43     arc_weak.clone();
44     sync::Weak::clone(&arc_weak);
45
46     let x = Arc::new(SomeImpl);
47     let _: Arc<SomeTrait> = x.clone();
48 }
49
50 fn clone_on_copy_generic<T: Copy>(t: T) {
51     t.clone();
52
53     Some(t).clone();
54 }
55
56 fn clone_on_double_ref() {
57     let x = vec![1];
58     let y = &&x;
59     let z: &Vec<_> = y.clone();
60
61     println!("{:p} {:p}", *y, z);
62 }
63
64 fn iter_clone_collect() {
65     let v = [1, 2, 3, 4, 5];
66     let v2: Vec<isize> = v.iter().cloned().collect();
67     let v3: HashSet<isize> = v.iter().cloned().collect();
68     let v4: VecDeque<isize> = v.iter().cloned().collect();
69 }
70
71 mod many_derefs {
72     struct A;
73     struct B;
74     struct C;
75     struct D;
76     #[derive(Copy, Clone)]
77     struct E;
78
79     macro_rules! impl_deref {
80         ($src:ident, $dst:ident) => {
81             impl std::ops::Deref for $src {
82                 type Target = $dst;
83                 fn deref(&self) -> &Self::Target {
84                     &$dst
85                 }
86             }
87         };
88     }
89
90     impl_deref!(A, B);
91     impl_deref!(B, C);
92     impl_deref!(C, D);
93     impl std::ops::Deref for D {
94         type Target = &'static E;
95         fn deref(&self) -> &Self::Target {
96             &&E
97         }
98     }
99
100     fn go1() {
101         let a = A;
102         let _: E = a.clone();
103         let _: E = *****a;
104     }
105 }