// build-fail trait Tr { const A: u8 = 255; // This should not be a constant evaluation error (overflow). The value of // `Self::A` must not be assumed to hold inside the trait. const B: u8 = Self::A + 1; //~^ ERROR any use of this value will cause an error //~| WARN this was previously accepted by the compiler but is being phased out } // An impl that doesn't override any constant will NOT cause a const eval error // just because it's defined, but only if the bad constant is used anywhere. // This matches the behavior without defaults. impl Tr for () {} // An impl that overrides either constant with a suitable value will be fine. impl Tr for u8 { const A: u8 = 254; } impl Tr for u16 { const B: u8 = 0; } impl Tr for u32 { const A: u8 = 254; const B: u8 = 0; } fn main() { assert_eq!(<() as Tr>::A, 255); assert_eq!(<() as Tr>::B, 0); // causes the error above //~^ ERROR evaluation of constant value failed //~| ERROR erroneous constant used //~| WARN this was previously accepted by the compiler but is being phased out assert_eq!(::A, 254); assert_eq!(::B, 255); assert_eq!(::A, 255); assert_eq!(::B, 0); assert_eq!(::A, 254); assert_eq!(::B, 0); }