33 lines
683 B
Rust
33 lines
683 B
Rust
// check-pass
|
|
|
|
// This test exhibits undefined behavior, but it is very expensive and complex to check for such
|
|
// UB in constants.
|
|
// Thus, we do not detect it if you create references to statics in ways that are UB.
|
|
|
|
enum Foo {
|
|
A = 5,
|
|
B = 42,
|
|
}
|
|
enum Bar {
|
|
C = 42,
|
|
D = 99,
|
|
}
|
|
#[repr(C)]
|
|
union Union {
|
|
foo: &'static Foo,
|
|
bar: &'static Bar,
|
|
u8: &'static u8,
|
|
}
|
|
static BAR: u8 = 5;
|
|
static FOO: (&Foo, &Bar) = unsafe {
|
|
(
|
|
// undefined behavior
|
|
Union { u8: &BAR }.foo,
|
|
Union { u8: &BAR }.bar,
|
|
)
|
|
};
|
|
static FOO2: (&Foo, &Bar) = unsafe { (std::mem::transmute(&BAR), std::mem::transmute(&BAR)) };
|
|
//^ undefined behavior
|
|
|
|
fn main() {}
|