//@ normalize-stderr-test: "(the raw bytes of the constant) \(size: [0-9]*, align: [0-9]*\)" -> "$1 (size: $$SIZE, align: $$ALIGN)" //@ normalize-stderr-test: "([0-9a-f][0-9a-f] |╾─*ALLOC[0-9]+(\+[a-z0-9]+)?()?─*╼ )+ *│.*" -> "HEX_DUMP" #![feature(const_refs_to_static)] #![allow(static_mut_refs)] fn invalid() { static S: i8 = 10; const C: &bool = unsafe { std::mem::transmute(&S) }; //~^ERROR: undefined behavior //~| expected a boolean // This must be rejected here (or earlier), since it's not a valid `&bool`. match &true { C => {} //~ERROR: could not evaluate constant pattern _ => {} } } fn extern_() { extern "C" { static S: i8; } const C: &i8 = unsafe { &S }; //~^ERROR: undefined behavior //~| `extern` static // This must be rejected here (or earlier), since the pattern cannot be read. match &0 { C => {} //~ERROR: could not evaluate constant pattern _ => {} } } fn mutable() { static mut S_MUT: i32 = 0; const C: &i32 = unsafe { &S_MUT }; //~^ERROR: undefined behavior //~| encountered reference to mutable memory // This *must not build*, the constant we are matching against // could change its value! match &42 { C => {} //~ERROR: could not evaluate constant pattern _ => {} } } fn main() {}