1 //@compile-flags: -Zmiri-strict-provenance
2 #![feature(new_uninit)]
3 #![feature(get_mut_unchecked)]
5 use std::cell::{Cell, RefCell};
7 use std::rc::{Rc, Weak};
8 use std::sync::{Arc, Weak as ArcWeak};
11 let r = Rc::new(RefCell::new(42));
13 *r.borrow_mut() += 10;
19 let r = Rc::new(Cell::new(42));
23 assert_eq!(r.get(), 84);
27 let r = Rc::new(RefCell::new(42));
29 *r.borrow_mut() += 10;
33 assert_eq!((*x + *y) / 2, 52);
38 let r2 = Rc::into_raw(r.clone());
39 let r2 = unsafe { Rc::from_raw(r2) };
40 assert!(Rc::ptr_eq(&r, &r2));
42 assert!(Rc::try_unwrap(r2).is_ok());
46 fn test() -> Arc<i32> {
50 assert_eq!(*test(), 42);
52 let raw = ArcWeak::into_raw(ArcWeak::<usize>::new());
53 drop(unsafe { ArcWeak::from_raw(raw) });
56 // Make sure this Rc doesn't fall apart when touched
57 fn check_unique_rc<T: ?Sized>(mut r: Rc<T>) {
59 assert!(Rc::get_mut(&mut r).is_none());
61 assert!(Rc::get_mut(&mut r).is_some());
65 check_unique_rc::<[_]>(Rc::from(&[1, 2, 3] as &[_]));
66 check_unique_rc::<[_]>(Rc::from(vec![1, 2, 3]));
67 check_unique_rc::<[_]>(Rc::from(Box::new([1, 2, 3]) as Box<[_]>));
68 check_unique_rc::<str>(Rc::from("Hello, World!"));
72 let p = Rc::new(1) as Rc<dyn Debug>;
73 let a: *const dyn Debug = &*p;
74 let r = Rc::into_raw(p);
76 drop(unsafe { Rc::from_raw(r) });
79 /// Taken from the `Weak::into_raw` doctest.
81 let strong = Rc::new(42);
82 let weak = Rc::downgrade(&strong);
83 let raw = Weak::into_raw(weak);
85 assert_eq!(1, Rc::weak_count(&strong));
86 assert_eq!(42, unsafe { *raw });
88 drop(unsafe { Weak::from_raw(raw) });
89 assert_eq!(0, Rc::weak_count(&strong));
91 let raw = Weak::into_raw(Weak::<usize>::new());
92 drop(unsafe { Weak::from_raw(raw) });
95 /// Taken from the `Weak::from_raw` doctest.
97 let strong = Rc::new(42);
99 let raw_1 = Weak::into_raw(Rc::downgrade(&strong));
100 let raw_2 = Weak::into_raw(Rc::downgrade(&strong));
102 assert_eq!(2, Rc::weak_count(&strong));
104 assert_eq!(42, *Weak::upgrade(&unsafe { Weak::from_raw(raw_1) }).unwrap());
105 assert_eq!(1, Rc::weak_count(&strong));
109 // Decrement the last weak count.
110 assert!(Weak::upgrade(&unsafe { Weak::from_raw(raw_2) }).is_none());
114 let mut five = Rc::<Box<u32>>::new_uninit();
116 // Deferred initialization:
117 Rc::get_mut_unchecked(&mut five).as_mut_ptr().write(Box::new(5));
120 assert_eq!(**five, 5)
123 fn rc_uninit_slice() {
124 let mut values = Rc::<[Box<usize>]>::new_uninit_slice(3);
126 let values = unsafe {
127 // Deferred initialization:
128 Rc::get_mut_unchecked(&mut values)[0].as_mut_ptr().write(Box::new(0));
129 Rc::get_mut_unchecked(&mut values)[1].as_mut_ptr().write(Box::new(1));
130 Rc::get_mut_unchecked(&mut values)[2].as_mut_ptr().write(Box::new(2));
135 for (idx, i) in values.iter().enumerate() {
136 assert_eq!(idx, **i);