summaryrefslogtreecommitdiffstats
path: root/tests/codegen/issues/issue-111603.rs
blob: 06429ed3fa9bb688dd421275887b07eefe101036 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// compile-flags: -O

#![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: [1000 x i64]
    // 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() }
}