2020-07-30 10:58:39 -05:00
|
|
|
// check-pass
|
|
|
|
|
|
|
|
// This test exhibits undefined behavior, but it is impossible to prevent generally during
|
2020-08-10 05:08:52 -05:00
|
|
|
// const eval, even if it could be prevented in the cases here if we added expensive and
|
|
|
|
// complex checks in rustc.
|
|
|
|
// The reason it's impossible in general
|
2020-07-30 10:58:39 -05:00
|
|
|
// is that we run into query cycles even *without* UB, just because we're checking for UB.
|
|
|
|
// We do not detect it if you create references to statics
|
|
|
|
// in ways that are UB.
|
|
|
|
|
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() {}
|