File: if-no-match-bindings.rs

package info (click to toggle)
rustc 1.88.0%2Bdfsg1-2
  • links: PTS, VCS
  • area: main
  • in suites: experimental, forky, sid
  • size: 934,168 kB
  • sloc: xml: 158,127; python: 36,062; javascript: 19,855; sh: 19,700; cpp: 18,947; ansic: 12,993; asm: 4,792; makefile: 690; perl: 29; lisp: 29; ruby: 19; sql: 11
file content (29 lines) | stat: -rw-r--r-- 1,110 bytes parent folder | download | duplicates (16)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 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]
}