mirror of https://github.com/rust-lang/rust.git
Deny braced macro invocations in let-else
This commit is contained in:
parent
6ae4cfbbb0
commit
c1c7707238
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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() {}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue