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