2020-05-16 19:15:25 +00:00
|
|
|
//@ run-pass
|
|
|
|
|
2020-05-17 17:23:44 +00:00
|
|
|
// When the NRVO is applied, the return place (`_0`) gets treated like a normal local. For example,
|
2023-10-02 06:35:08 +00:00
|
|
|
// its address may be taken and it may be written to indirectly. Ensure that the const-eval
|
|
|
|
// interpreter can handle this.
|
2020-05-17 17:23:44 +00:00
|
|
|
|
|
|
|
#![feature(const_mut_refs)]
|
|
|
|
|
|
|
|
#[inline(never)] // Try to ensure that MIR optimizations don't optimize this away.
|
2020-05-16 19:15:25 +00:00
|
|
|
const fn init(buf: &mut [u8; 1024]) {
|
|
|
|
buf[33] = 3;
|
|
|
|
buf[444] = 4;
|
|
|
|
}
|
|
|
|
|
2020-05-17 17:23:44 +00:00
|
|
|
const fn nrvo() -> [u8; 1024] {
|
2020-05-16 19:15:25 +00:00
|
|
|
let mut buf = [0; 1024];
|
|
|
|
init(&mut buf);
|
|
|
|
buf
|
|
|
|
}
|
|
|
|
|
2020-05-17 17:23:44 +00:00
|
|
|
const BUF: [u8; 1024] = nrvo();
|
2020-05-16 19:15:25 +00:00
|
|
|
|
|
|
|
fn main() {
|
|
|
|
assert_eq!(BUF[33], 3);
|
|
|
|
assert_eq!(BUF[19], 0);
|
|
|
|
assert_eq!(BUF[444], 4);
|
|
|
|
}
|