1 #![warn(clippy::clone_on_ref_ptr)]
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};
12 impl SomeTrait for SomeImpl {}
19 vec![1].clone(); // ok, not a Copy type
20 Some(vec![1]).clone(); // ok, not a Copy type
23 let rc = RefCell::new(0);
28 let _ = &x.clone(); // ok, getting a ref
29 'a'.clone().make_ascii_uppercase(); // ok, clone and then mutate
32 fn clone_on_ref_ptr() {
33 let rc = Rc::new(true);
34 let arc = Arc::new(true);
36 let rcweak = Rc::downgrade(&rc);
37 let arc_weak = Arc::downgrade(&arc);
46 rc::Weak::clone(&rcweak);
49 sync::Weak::clone(&arc_weak);
51 let x = Arc::new(SomeImpl);
52 let _: Arc<dyn SomeTrait> = x.clone();
55 fn clone_on_copy_generic<T: Copy>(t: T) {
61 fn clone_on_double_ref() {
64 let z: &Vec<_> = y.clone();
66 println!("{:p} {:p}", *y, z);
69 fn iter_clone_collect() {
70 let v = [1, 2, 3, 4, 5];
71 let v2: Vec<isize> = v.iter().cloned().collect();
72 let v3: HashSet<isize> = v.iter().cloned().collect();
73 let v4: VecDeque<isize> = v.iter().cloned().collect();
75 // Handle macro expansion in suggestion
76 let _: Vec<isize> = vec![1, 2, 3].iter().cloned().collect();
80 let _: Vec<u8> = std::ffi::CStr::from_ptr(std::ptr::null())
93 #[derive(Copy, Clone)]
96 macro_rules! impl_deref {
97 ($src:ident, $dst:ident) => {
98 impl std::ops::Deref for $src {
100 fn deref(&self) -> &Self::Target {
110 impl std::ops::Deref for D {
111 type Target = &'static E;
112 fn deref(&self) -> &Self::Target {
119 let _: E = a.clone();