// Checks for `if` expressions with respect to default match bindings. // Specifically, we do not accept `if cond { ... }` where `cond: &mut? bool`. // Meanwhile, `match cond { true => ..., _ => ... }` does accept that. // FIXME(@rust-lang/lang-team): consider relaxing this? fn b_ref<'a>() -> &'a bool { &true } fn b_mut_ref<'a>() -> &'a mut bool { &mut true } //~^ ERROR: cannot return reference to temporary fn main() { // This is OK: match b_ref() { true => {}, _ => {} } match b_mut_ref() { true => {}, _ => {} } match &true { true => {}, _ => {} } match &mut true { true => {}, _ => {} } // This is NOT: if b_ref() {} //~ ERROR mismatched types [E0308] if b_mut_ref() {} //~ ERROR mismatched types [E0308] if &true {} //~ ERROR mismatched types [E0308] if &mut true {} //~ ERROR mismatched types [E0308] // This is also NOT: while b_ref() {} //~ ERROR mismatched types [E0308] while b_mut_ref() {} //~ ERROR mismatched types [E0308] while &true {} //~ ERROR mismatched types [E0308] while &mut true {} //~ ERROR mismatched types [E0308] }