2021-10-27 19:00:00 -05:00
|
|
|
// Check that constants with interior mutability inside unions are rejected
|
|
|
|
// during validation.
|
|
|
|
//
|
|
|
|
//@ build-fail
|
|
|
|
//@ stderr-per-bitwidth
|
2022-06-29 21:33:18 -05:00
|
|
|
|
2021-10-27 19:00:00 -05:00
|
|
|
use std::cell::Cell;
|
2022-06-29 21:33:18 -05:00
|
|
|
use std::mem::ManuallyDrop;
|
2021-10-27 19:00:00 -05:00
|
|
|
|
|
|
|
#[repr(C)]
|
|
|
|
struct S {
|
|
|
|
x: u32,
|
|
|
|
y: E,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[repr(u32)]
|
|
|
|
enum E {
|
|
|
|
A,
|
|
|
|
B(U)
|
|
|
|
}
|
|
|
|
|
|
|
|
union U {
|
2022-06-29 21:33:18 -05:00
|
|
|
cell: ManuallyDrop<Cell<u32>>,
|
2021-10-27 19:00:00 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
const C: S = {
|
2023-11-26 09:57:13 -06:00
|
|
|
let mut s = S { x: 0, y: E::A };
|
|
|
|
let p = &mut s.x as *mut u32;
|
|
|
|
// Change enum tag to E::B. Now there's interior mutability here.
|
2021-10-27 19:00:00 -05:00
|
|
|
unsafe { *p.add(1) = 1 };
|
|
|
|
s
|
|
|
|
};
|
|
|
|
|
|
|
|
fn main() { //~ ERROR it is undefined behavior to use this value
|
2022-11-15 05:06:20 -06:00
|
|
|
// FIXME the span here is wrong, sould be pointing at the line below, not above.
|
|
|
|
let _: &'static _ = &C;
|
2021-10-27 19:00:00 -05:00
|
|
|
}
|