mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-31 05:26:23 +03:00
Auto merge of #913 - RalfJung:uninit, r=RalfJung
test some new uninit APIs
This commit is contained in:
@@ -1,4 +1,6 @@
|
||||
#![feature(weak_into_raw)]
|
||||
#![feature(new_uninit)]
|
||||
#![feature(get_mut_unchecked)]
|
||||
|
||||
use std::cell::{Cell, RefCell};
|
||||
use std::rc::{Rc, Weak};
|
||||
@@ -102,6 +104,33 @@ fn weak_from_raw() {
|
||||
assert!(Weak::upgrade(&unsafe { Weak::from_raw(raw_2) }).is_none());
|
||||
}
|
||||
|
||||
fn rc_uninit() {
|
||||
let mut five = Rc::<Box<u32>>::new_uninit();
|
||||
let five = unsafe {
|
||||
// Deferred initialization:
|
||||
Rc::get_mut_unchecked(&mut five).as_mut_ptr().write(Box::new(5));
|
||||
five.assume_init()
|
||||
};
|
||||
assert_eq!(**five, 5)
|
||||
}
|
||||
|
||||
fn rc_uninit_slice() {
|
||||
let mut values = Rc::<[Box<usize>]>::new_uninit_slice(3);
|
||||
|
||||
let values = unsafe {
|
||||
// Deferred initialization:
|
||||
Rc::get_mut_unchecked(&mut values)[0].as_mut_ptr().write(Box::new(0));
|
||||
Rc::get_mut_unchecked(&mut values)[1].as_mut_ptr().write(Box::new(1));
|
||||
Rc::get_mut_unchecked(&mut values)[2].as_mut_ptr().write(Box::new(2));
|
||||
|
||||
values.assume_init()
|
||||
};
|
||||
|
||||
for (idx, i) in values.iter().enumerate() {
|
||||
assert_eq!(idx, **i);
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
rc_fat_ptr_eq();
|
||||
rc_refcell();
|
||||
@@ -111,6 +140,8 @@ fn main() {
|
||||
rc_from();
|
||||
weak_into_raw();
|
||||
weak_from_raw();
|
||||
rc_uninit();
|
||||
rc_uninit_slice();
|
||||
|
||||
arc();
|
||||
}
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
#![feature(new_uninit)]
|
||||
|
||||
use std::slice;
|
||||
|
||||
fn slice_of_zst() {
|
||||
@@ -169,7 +171,23 @@ fn test_mut<T : Copy + Debug + PartialEq>(x : T) {
|
||||
test_mut([0u32; 0]); // ZST with alignment > 0
|
||||
}
|
||||
|
||||
fn uninit_slice() {
|
||||
let mut values = Box::<[Box<u32>]>::new_uninit_slice(3);
|
||||
|
||||
let values = unsafe {
|
||||
// Deferred initialization:
|
||||
values[0].as_mut_ptr().write(Box::new(1));
|
||||
values[1].as_mut_ptr().write(Box::new(2));
|
||||
values[2].as_mut_ptr().write(Box::new(3));
|
||||
|
||||
values.assume_init()
|
||||
};
|
||||
|
||||
assert_eq!(values.iter().map(|x| **x).collect::<Vec<_>>(), vec![1, 2, 3])
|
||||
}
|
||||
|
||||
fn main() {
|
||||
slice_of_zst();
|
||||
test_iter_ref_consistency();
|
||||
uninit_slice();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user