// check-pass // compile-flags: -Z validate-mir struct Foo<'a>(&'a mut u32); impl<'a> Drop for Foo<'a> { fn drop(&mut self) { *self.0 = 0; } } fn and() { let mut foo = 0; // This used to compile also before the fix if true && *Foo(&mut foo).0 == 0 && ({ foo = 0; true}) {} // This used to fail before the fix if *Foo(&mut foo).0 == 0 && ({ foo = 0; true}) {} println!("{foo}"); } fn or() { let mut foo = 0; // This used to compile also before the fix if false || *Foo(&mut foo).0 == 1 || ({ foo = 0; true}) {} // This used to fail before the fix if *Foo(&mut foo).0 == 1 || ({ foo = 0; true}) {} println!("{foo}"); } fn main() { and(); or(); }