28 lines
650 B
Rust
28 lines
650 B
Rust
// run-pass
|
|
|
|
// When the NRVO is applied, the return place (`_0`) gets treated like a normal local. For example,
|
|
// its address may be taken and it may be written to indirectly. Ensure that the const-eval
|
|
// interpreter can handle this.
|
|
|
|
#![feature(const_mut_refs)]
|
|
|
|
#[inline(never)] // Try to ensure that MIR optimizations don't optimize this away.
|
|
const fn init(buf: &mut [u8; 1024]) {
|
|
buf[33] = 3;
|
|
buf[444] = 4;
|
|
}
|
|
|
|
const fn nrvo() -> [u8; 1024] {
|
|
let mut buf = [0; 1024];
|
|
init(&mut buf);
|
|
buf
|
|
}
|
|
|
|
const BUF: [u8; 1024] = nrvo();
|
|
|
|
fn main() {
|
|
assert_eq!(BUF[33], 3);
|
|
assert_eq!(BUF[19], 0);
|
|
assert_eq!(BUF[444], 4);
|
|
}
|