2020-07-30 10:58:39 -05:00
|
|
|
// check-pass
|
|
|
|
|
2020-08-10 05:40:29 -05:00
|
|
|
// 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.
|
2020-07-30 10:58:39 -05:00
|
|
|
|
2018-06-04 11:32:06 -05:00
|
|
|
enum Foo {
|
|
|
|
A = 5,
|
|
|
|
B = 42,
|
|
|
|
}
|
|
|
|
enum Bar {
|
|
|
|
C = 42,
|
|
|
|
D = 99,
|
|
|
|
}
|
2019-08-30 02:35:02 -05:00
|
|
|
#[repr(C)]
|
2018-06-04 11:32:06 -05:00
|
|
|
union Union {
|
|
|
|
foo: &'static Foo,
|
|
|
|
bar: &'static Bar,
|
2018-09-16 13:27:56 -05:00
|
|
|
u8: &'static u8,
|
2018-06-04 11:32:06 -05:00
|
|
|
}
|
2018-09-16 13:27:56 -05:00
|
|
|
static BAR: u8 = 5;
|
2020-07-30 10:58:39 -05:00
|
|
|
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
|
2018-06-04 11:32:06 -05:00
|
|
|
|
|
|
|
fn main() {}
|