rustc_ast::util::classify

Function expr_requires_semi_to_be_stmt

Source
pub fn expr_requires_semi_to_be_stmt(e: &Expr) -> bool
Expand description

Does this expression require a semicolon to be treated as a statement?

The negation of this: “can this expression be used as a statement without a semicolon” – is used as an early bail-out when parsing statements so that, for instance,

if true {...} else {...}
|x| 5

isn’t parsed as (if true {...} else {...} | x) | 5.

Surprising special case: even though braced macro calls like m! {} normally do not introduce a boundary when found at the head of a match arm, they do terminate the parsing of a statement.

match ... {
    _ => m! {} (),  // macro that expands to a function, which is then called
}

let _ = { m! {} () };  // macro call followed by unit