Add a note to the ArbitraryExpressionInPattern error
This commit is contained in:
parent
4d570eea02
commit
4284bca720
9 changed files with 39 additions and 1 deletions
|
@ -5,6 +5,7 @@ ast_lowering_abi_specified_multiple_times =
|
||||||
|
|
||||||
ast_lowering_arbitrary_expression_in_pattern =
|
ast_lowering_arbitrary_expression_in_pattern =
|
||||||
arbitrary expressions aren't allowed in patterns
|
arbitrary expressions aren't allowed in patterns
|
||||||
|
.pattern_from_macro_note = the :expr fragment specifier forces the metavariable's content to be an expression
|
||||||
|
|
||||||
ast_lowering_argument = argument
|
ast_lowering_argument = argument
|
||||||
|
|
||||||
|
|
|
@ -368,6 +368,8 @@ pub struct NeverPatternWithGuard {
|
||||||
pub struct ArbitraryExpressionInPattern {
|
pub struct ArbitraryExpressionInPattern {
|
||||||
#[primary_span]
|
#[primary_span]
|
||||||
pub span: Span,
|
pub span: Span,
|
||||||
|
#[note(ast_lowering_pattern_from_macro_note)]
|
||||||
|
pub pattern_from_macro_note: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Diagnostic)]
|
#[derive(Diagnostic)]
|
||||||
|
|
|
@ -339,7 +339,11 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
||||||
ExprKind::Path(..) if allow_paths => {}
|
ExprKind::Path(..) if allow_paths => {}
|
||||||
ExprKind::Unary(UnOp::Neg, inner) if matches!(inner.kind, ExprKind::Lit(_)) => {}
|
ExprKind::Unary(UnOp::Neg, inner) if matches!(inner.kind, ExprKind::Lit(_)) => {}
|
||||||
_ => {
|
_ => {
|
||||||
let guar = self.dcx().emit_err(ArbitraryExpressionInPattern { span: expr.span });
|
let pattern_from_macro = expr.is_approximately_pattern();
|
||||||
|
let guar = self.dcx().emit_err(ArbitraryExpressionInPattern {
|
||||||
|
span: expr.span,
|
||||||
|
pattern_from_macro_note: pattern_from_macro,
|
||||||
|
});
|
||||||
return self.arena.alloc(self.expr_err(expr.span, guar));
|
return self.arena.alloc(self.expr_err(expr.span, guar));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,12 +3,16 @@ error: arbitrary expressions aren't allowed in patterns
|
||||||
|
|
|
|
||||||
LL | m!(y);
|
LL | m!(y);
|
||||||
| ^
|
| ^
|
||||||
|
|
|
||||||
|
= note: the :expr fragment specifier forces the metavariable's content to be an expression
|
||||||
|
|
||||||
error: arbitrary expressions aren't allowed in patterns
|
error: arbitrary expressions aren't allowed in patterns
|
||||||
--> $DIR/issue-43250.rs:11:8
|
--> $DIR/issue-43250.rs:11:8
|
||||||
|
|
|
|
||||||
LL | m!(C);
|
LL | m!(C);
|
||||||
| ^
|
| ^
|
||||||
|
|
|
||||||
|
= note: the :expr fragment specifier forces the metavariable's content to be an expression
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
|
11
tests/ui/lowering/expr-in-pat-issue-99380.rs
Normal file
11
tests/ui/lowering/expr-in-pat-issue-99380.rs
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
macro_rules! foo {
|
||||||
|
($p:expr) => {
|
||||||
|
if let $p = Some(42) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
foo!(Some(3)); //~ ERROR arbitrary expressions aren't allowed in patterns
|
||||||
|
}
|
10
tests/ui/lowering/expr-in-pat-issue-99380.stderr
Normal file
10
tests/ui/lowering/expr-in-pat-issue-99380.stderr
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
error: arbitrary expressions aren't allowed in patterns
|
||||||
|
--> $DIR/expr-in-pat-issue-99380.rs:10:10
|
||||||
|
|
|
||||||
|
LL | foo!(Some(3));
|
||||||
|
| ^^^^^^^
|
||||||
|
|
|
||||||
|
= note: the :expr fragment specifier forces the metavariable's content to be an expression
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
|
@ -4,6 +4,7 @@ error: arbitrary expressions aren't allowed in patterns
|
||||||
LL | Some(vec![43]) => {}
|
LL | Some(vec![43]) => {}
|
||||||
| ^^^^^^^^
|
| ^^^^^^^^
|
||||||
|
|
|
|
||||||
|
= note: the :expr fragment specifier forces the metavariable's content to be an expression
|
||||||
= note: this error originates in the macro `vec` (in Nightly builds, run with -Z macro-backtrace for more info)
|
= note: this error originates in the macro `vec` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
|
@ -9,6 +9,8 @@ error: arbitrary expressions aren't allowed in patterns
|
||||||
|
|
|
|
||||||
LL | funny!(a, a);
|
LL | funny!(a, a);
|
||||||
| ^
|
| ^
|
||||||
|
|
|
||||||
|
= note: the :expr fragment specifier forces the metavariable's content to be an expression
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ LL | () => { force_expr!(Vec::new()) }
|
||||||
LL | assert!(matches!(x, En::A(make_vec!())));
|
LL | assert!(matches!(x, En::A(make_vec!())));
|
||||||
| ----------- in this macro invocation
|
| ----------- in this macro invocation
|
||||||
|
|
|
|
||||||
|
= note: the :expr fragment specifier forces the metavariable's content to be an expression
|
||||||
= note: this error originates in the macro `make_vec` (in Nightly builds, run with -Z macro-backtrace for more info)
|
= note: this error originates in the macro `make_vec` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
error: arbitrary expressions aren't allowed in patterns
|
error: arbitrary expressions aren't allowed in patterns
|
||||||
|
@ -18,6 +19,7 @@ LL | () => { force_pat!(get_usize(), get_usize()) }
|
||||||
LL | assert!(matches!(5, make_pat!()));
|
LL | assert!(matches!(5, make_pat!()));
|
||||||
| ----------- in this macro invocation
|
| ----------- in this macro invocation
|
||||||
|
|
|
|
||||||
|
= note: the :expr fragment specifier forces the metavariable's content to be an expression
|
||||||
= note: this error originates in the macro `make_pat` (in Nightly builds, run with -Z macro-backtrace for more info)
|
= note: this error originates in the macro `make_pat` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
error: arbitrary expressions aren't allowed in patterns
|
error: arbitrary expressions aren't allowed in patterns
|
||||||
|
@ -29,6 +31,7 @@ LL | () => { force_pat!(get_usize(), get_usize()) }
|
||||||
LL | assert!(matches!(5, make_pat!()));
|
LL | assert!(matches!(5, make_pat!()));
|
||||||
| ----------- in this macro invocation
|
| ----------- in this macro invocation
|
||||||
|
|
|
|
||||||
|
= note: the :expr fragment specifier forces the metavariable's content to be an expression
|
||||||
= note: this error originates in the macro `make_pat` (in Nightly builds, run with -Z macro-backtrace for more info)
|
= note: this error originates in the macro `make_pat` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue