Skip to content

Commit

Permalink
Deny braced macro invocations in let-else
Browse files Browse the repository at this point in the history
  • Loading branch information
compiler-errors committed Jan 17, 2024
1 parent 6ae4cfb commit c1c7707
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 4 deletions.
10 changes: 7 additions & 3 deletions compiler/rustc_ast/src/util/classify.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

// Predicates on exprs and stmts that the pretty-printer and parser use

use crate::ast;
use crate::{ast, token::Delimiter};

/// Does this expression require a semicolon to be treated
/// as a statement? The negation of this: 'can this expression
Expand Down Expand Up @@ -59,8 +59,12 @@ pub fn expr_trailing_brace(mut expr: &ast::Expr) -> Option<&ast::Expr> {
| While(..)
| ConstBlock(_) => break Some(expr),

// FIXME: These can end in `}`, but changing these would break stable code.
InlineAsm(_) | OffsetOf(_, _) | MacCall(_) | IncludedBytes(_) | FormatArgs(_) => {
MacCall(mac) => {
break (mac.args.delim == Delimiter::Brace).then_some(expr);
}

InlineAsm(_) | OffsetOf(_, _) | IncludedBytes(_) | FormatArgs(_) => {
// These should have been denied pre-expansion.
break None;
}

Expand Down
25 changes: 25 additions & 0 deletions tests/ui/parser/bad-let-else-statement.rs
Original file line number Diff line number Diff line change
Expand Up @@ -161,4 +161,29 @@ fn q() {
};
}

fn r() {
let ok = format_args!("") else { return; };

let bad = format_args! {""} else { return; };
//~^ ERROR right curly brace `}` before `else` in a `let...else` statement not allowed
}

fn s() {
macro_rules! a {
() => { {} }
}

macro_rules! b {
(1) => {
let x = a!() else { return; };
};
(2) => {
let x = a! {} else { return; };
//~^ ERROR right curly brace `}` before `else` in a `let...else` statement not allowed
};
}

b!(1); b!(2);
}

fn main() {}
28 changes: 27 additions & 1 deletion tests/ui/parser/bad-let-else-statement.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -228,5 +228,31 @@ LL | x
LL ~ }) else {
|

error: aborting due to 17 previous errors
error: right curly brace `}` before `else` in a `let...else` statement not allowed
--> $DIR/bad-let-else-statement.rs:167:31
|
LL | let bad = format_args! {""} else { return; };
| ^
|
help: wrap the expression in parentheses
|
LL | let bad = (format_args! {""}) else { return; };
| + +

error: right curly brace `}` before `else` in a `let...else` statement not allowed
--> $DIR/bad-let-else-statement.rs:181:25
|
LL | let x = a! {} else { return; };
| ^
...
LL | b!(1); b!(2);
| ----- in this macro invocation
|
= note: this error originates in the macro `b` (in Nightly builds, run with -Z macro-backtrace for more info)
help: wrap the expression in parentheses
|
LL | let x = (a! {}) else { return; };
| + +

error: aborting due to 19 previous errors

0 comments on commit c1c7707

Please sign in to comment.