rust/tests/ui/consts/const-eval/union-ub.rs

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

44 lines
776 B
Rust
Raw Normal View History

//@ stderr-per-bitwidth
#[repr(C)]
2018-06-04 11:32:06 -05:00
union DummyUnion {
unit: (),
2018-06-04 11:32:06 -05:00
u8: u8,
bool: bool,
}
#[repr(C)]
#[derive(Copy, Clone)]
enum Enum {
A,
B,
C,
}
#[derive(Copy, Clone)]
#[repr(C)]
2018-06-04 11:32:06 -05:00
union Foo {
a: bool,
b: Enum,
}
#[repr(C)]
2018-06-04 11:32:06 -05:00
union Bar {
foo: Foo,
u8: u8,
}
// the value is not valid for bools
const BAD_BOOL: bool = unsafe { DummyUnion { u8: 42 }.bool};
//~^ ERROR it is undefined behavior to use this value
const UNINIT_BOOL: bool = unsafe { DummyUnion { unit: () }.bool};
//~^ ERROR evaluation of constant value failed
//~| uninitialized
2018-06-04 11:32:06 -05:00
// The value is not valid for any union variant, but that's fine
// unions are just a convenient way to transmute bits around
const BAD_UNION: Foo = unsafe { Bar { u8: 42 }.foo };
fn main() {}