| //@ compile-flags: -Copt-level=3 | |
| #![crate_type = "lib"] | |
| #![feature(get_mut_unchecked, new_uninit)] | |
| use std::sync::Arc; | |
| // CHECK-LABEL: @new_from_array | |
| #[no_mangle] | |
| pub fn new_from_array(x: u64) -> Arc<[u64]> { | |
| // Ensure that we only generate one alloca for the array. | |
| // CHECK: alloca | |
| // CHECK-SAME: [8000 x i8] | |
| // CHECK-NOT: alloca | |
| let array = [x; 1000]; | |
| Arc::new(array) | |
| } | |
| // CHECK-LABEL: @new_uninit | |
| #[no_mangle] | |
| pub fn new_uninit(x: u64) -> Arc<[u64; 1000]> { | |
| // CHECK: call alloc::sync::arcinner_layout_for_value_layout | |
| // CHECK-NOT: call alloc::sync::arcinner_layout_for_value_layout | |
| let mut arc = Arc::new_uninit(); | |
| unsafe { Arc::get_mut_unchecked(&mut arc) }.write([x; 1000]); | |
| unsafe { arc.assume_init() } | |
| } | |
| // CHECK-LABEL: @new_uninit_slice | |
| #[no_mangle] | |
| pub fn new_uninit_slice(x: u64) -> Arc<[u64]> { | |
| // CHECK: call alloc::sync::arcinner_layout_for_value_layout | |
| // CHECK-NOT: call alloc::sync::arcinner_layout_for_value_layout | |
| let mut arc = Arc::new_uninit_slice(1000); | |
| for elem in unsafe { Arc::get_mut_unchecked(&mut arc) } { | |
| elem.write(x); | |
| } | |
| unsafe { arc.assume_init() } | |
| } |