Reduce double errors for invalid let expressions

Previously some invalid let expressions would result in both a feature
error and a parsing error. Avoid this and ensure that we only emit the
parsing error when this happens.
This commit is contained in:
Matthew Jasper 2023-09-11 16:16:59 +00:00
parent 2d7a5f528c
commit b011a0a13b
7 changed files with 1249 additions and 140 deletions

View File

@ -2485,9 +2485,6 @@ impl<'a> Parser<'a> {
}
let expr = self.parse_expr_assoc_with(1 + prec_let_scrutinee_needs_par(), None.into())?;
let span = lo.to(expr.span);
if is_recovered.is_none() {
self.sess.gated_spans.gate(sym::let_chains, span);
}
Ok(self.mk_expr(span, ExprKind::Let(pat, expr, span, is_recovered)))
}
@ -3460,6 +3457,8 @@ impl MutVisitor for CondChecker<'_> {
.sess
.emit_err(errors::ExpectedExpressionFoundLet { span, reason }),
);
} else {
self.parser.sess.gated_spans.gate(sym::let_chains, span);
}
}
ExprKind::Binary(Spanned { node: BinOpKind::And, .. }, _, _) => {

View File

@ -4,7 +4,6 @@
fn a() {
if let x = 1 && i = 2 {}
//~^ ERROR cannot find value `i` in this scope
//~| ERROR `let` expressions in this position are unstable
//~| ERROR mismatched types
//~| ERROR expected expression, found `let` statement
}

View File

@ -11,7 +11,7 @@ LL | if let x = 1 && i = 2 {}
| ^ not found in this scope
error[E0425]: cannot find value `i` in this scope
--> $DIR/bad-if-let-suggestion.rs:13:9
--> $DIR/bad-if-let-suggestion.rs:12:9
|
LL | fn a() {
| ------ similarly named function `a` defined here
@ -20,7 +20,7 @@ LL | if (i + j) = i {}
| ^ help: a function with a similar name exists: `a`
error[E0425]: cannot find value `j` in this scope
--> $DIR/bad-if-let-suggestion.rs:13:13
--> $DIR/bad-if-let-suggestion.rs:12:13
|
LL | fn a() {
| ------ similarly named function `a` defined here
@ -29,7 +29,7 @@ LL | if (i + j) = i {}
| ^ help: a function with a similar name exists: `a`
error[E0425]: cannot find value `i` in this scope
--> $DIR/bad-if-let-suggestion.rs:13:18
--> $DIR/bad-if-let-suggestion.rs:12:18
|
LL | fn a() {
| ------ similarly named function `a` defined here
@ -38,7 +38,7 @@ LL | if (i + j) = i {}
| ^ help: a function with a similar name exists: `a`
error[E0425]: cannot find value `x` in this scope
--> $DIR/bad-if-let-suggestion.rs:20:8
--> $DIR/bad-if-let-suggestion.rs:19:8
|
LL | fn a() {
| ------ similarly named function `a` defined here
@ -46,15 +46,6 @@ LL | fn a() {
LL | if x[0] = 1 {}
| ^ help: a function with a similar name exists: `a`
error[E0658]: `let` expressions in this position are unstable
--> $DIR/bad-if-let-suggestion.rs:5:8
|
LL | if let x = 1 && i = 2 {}
| ^^^^^^^^^
|
= note: see issue #53667 <https://github.com/rust-lang/rust/issues/53667> for more information
= help: add `#![feature(let_chains)]` to the crate attributes to enable
error[E0308]: mismatched types
--> $DIR/bad-if-let-suggestion.rs:5:8
|
@ -66,7 +57,7 @@ help: you might have meant to compare for equality
LL | if let x = 1 && i == 2 {}
| +
error: aborting due to 8 previous errors
error: aborting due to 7 previous errors
Some errors have detailed explanations: E0308, E0425, E0658.
Some errors have detailed explanations: E0308, E0425.
For more information about an error, try `rustc --explain E0308`.

View File

@ -9,11 +9,9 @@ fn _if_let_guard() {
() if (let 0 = 1) => {}
//~^ ERROR expected expression, found `let` statement
//~| ERROR `let` expressions in this position are unstable
() if (((let 0 = 1))) => {}
//~^ ERROR expected expression, found `let` statement
//~| ERROR `let` expressions in this position are unstable
() if true && let 0 = 1 => {}
//~^ ERROR `if let` guards are experimental
@ -25,25 +23,18 @@ fn _if_let_guard() {
() if (let 0 = 1) && true => {}
//~^ ERROR expected expression, found `let` statement
//~| ERROR `let` expressions in this position are unstable
() if true && (let 0 = 1) => {}
//~^ ERROR expected expression, found `let` statement
//~| ERROR `let` expressions in this position are unstable
() if (let 0 = 1) && (let 0 = 1) => {}
//~^ ERROR expected expression, found `let` statement
//~| ERROR expected expression, found `let` statement
//~| ERROR `let` expressions in this position are unstable
//~| ERROR `let` expressions in this position are unstable
() if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) => {}
//~^ ERROR `if let` guards are experimental
//~| ERROR `let` expressions in this position are unstable
//~| ERROR `let` expressions in this position are unstable
//~| ERROR `let` expressions in this position are unstable
//~| ERROR `let` expressions in this position are unstable
//~| ERROR `let` expressions in this position are unstable
//~| ERROR expected expression, found `let` statement
//~| ERROR expected expression, found `let` statement
//~| ERROR expected expression, found `let` statement

View File

@ -11,115 +11,115 @@ LL | () if (let 0 = 1) => {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/feature-gate.rs:14:18
--> $DIR/feature-gate.rs:13:18
|
LL | () if (((let 0 = 1))) => {}
| ^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/feature-gate.rs:14:18
--> $DIR/feature-gate.rs:13:18
|
LL | () if (((let 0 = 1))) => {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/feature-gate.rs:26:16
--> $DIR/feature-gate.rs:24:16
|
LL | () if (let 0 = 1) && true => {}
| ^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/feature-gate.rs:26:16
--> $DIR/feature-gate.rs:24:16
|
LL | () if (let 0 = 1) && true => {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/feature-gate.rs:30:24
--> $DIR/feature-gate.rs:27:24
|
LL | () if true && (let 0 = 1) => {}
| ^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/feature-gate.rs:30:24
--> $DIR/feature-gate.rs:27:24
|
LL | () if true && (let 0 = 1) => {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/feature-gate.rs:34:16
--> $DIR/feature-gate.rs:30:16
|
LL | () if (let 0 = 1) && (let 0 = 1) => {}
| ^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/feature-gate.rs:34:16
--> $DIR/feature-gate.rs:30:16
|
LL | () if (let 0 = 1) && (let 0 = 1) => {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/feature-gate.rs:34:31
--> $DIR/feature-gate.rs:30:31
|
LL | () if (let 0 = 1) && (let 0 = 1) => {}
| ^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/feature-gate.rs:34:31
--> $DIR/feature-gate.rs:30:31
|
LL | () if (let 0 = 1) && (let 0 = 1) => {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/feature-gate.rs:40:42
--> $DIR/feature-gate.rs:34:42
|
LL | () if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) => {}
| ^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/feature-gate.rs:40:42
--> $DIR/feature-gate.rs:34:42
|
LL | () if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) => {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/feature-gate.rs:40:55
--> $DIR/feature-gate.rs:34:55
|
LL | () if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) => {}
| ^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/feature-gate.rs:40:42
--> $DIR/feature-gate.rs:34:42
|
LL | () if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) => {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/feature-gate.rs:40:68
--> $DIR/feature-gate.rs:34:68
|
LL | () if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) => {}
| ^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/feature-gate.rs:40:42
--> $DIR/feature-gate.rs:34:42
|
LL | () if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) => {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/feature-gate.rs:69:16
--> $DIR/feature-gate.rs:60:16
|
LL | use_expr!((let 0 = 1 && 0 == 0));
| ^^^
error: expected expression, found `let` statement
--> $DIR/feature-gate.rs:71:16
--> $DIR/feature-gate.rs:62:16
|
LL | use_expr!((let 0 = 1));
| ^^^
error: no rules expected the token `let`
--> $DIR/feature-gate.rs:79:15
--> $DIR/feature-gate.rs:70:15
|
LL | macro_rules! use_expr {
| --------------------- when calling this macro
@ -128,7 +128,7 @@ LL | use_expr!(let 0 = 1);
| ^^^ no rules expected this token in macro call
|
note: while trying to match meta-variable `$e:expr`
--> $DIR/feature-gate.rs:62:10
--> $DIR/feature-gate.rs:53:10
|
LL | ($e:expr) => {
| ^^^^^^^
@ -144,7 +144,7 @@ LL | () if let 0 = 1 => {}
= help: you can write `if matches!(<expr>, <pattern>)` instead of `if let <pattern> = <expr>`
error[E0658]: `if let` guards are experimental
--> $DIR/feature-gate.rs:18:12
--> $DIR/feature-gate.rs:16:12
|
LL | () if true && let 0 = 1 => {}
| ^^^^^^^^^^^^^^^^^^^^
@ -154,7 +154,7 @@ LL | () if true && let 0 = 1 => {}
= help: you can write `if matches!(<expr>, <pattern>)` instead of `if let <pattern> = <expr>`
error[E0658]: `if let` guards are experimental
--> $DIR/feature-gate.rs:22:12
--> $DIR/feature-gate.rs:20:12
|
LL | () if let 0 = 1 && true => {}
| ^^^^^^^^^^^^^^^^^^^^
@ -164,7 +164,7 @@ LL | () if let 0 = 1 && true => {}
= help: you can write `if matches!(<expr>, <pattern>)` instead of `if let <pattern> = <expr>`
error[E0658]: `if let` guards are experimental
--> $DIR/feature-gate.rs:40:12
--> $DIR/feature-gate.rs:34:12
|
LL | () if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) => {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -174,7 +174,7 @@ LL | () if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 =
= help: you can write `if matches!(<expr>, <pattern>)` instead of `if let <pattern> = <expr>`
error[E0658]: `if let` guards are experimental
--> $DIR/feature-gate.rs:52:12
--> $DIR/feature-gate.rs:43:12
|
LL | () if let Range { start: _, end: _ } = (true..true) && false => {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -184,7 +184,7 @@ LL | () if let Range { start: _, end: _ } = (true..true) && false => {}
= help: you can write `if matches!(<expr>, <pattern>)` instead of `if let <pattern> = <expr>`
error[E0658]: `if let` guards are experimental
--> $DIR/feature-gate.rs:75:12
--> $DIR/feature-gate.rs:66:12
|
LL | () if let 0 = 1 => {}
| ^^^^^^^^^^^^
@ -194,25 +194,7 @@ LL | () if let 0 = 1 => {}
= help: you can write `if matches!(<expr>, <pattern>)` instead of `if let <pattern> = <expr>`
error[E0658]: `let` expressions in this position are unstable
--> $DIR/feature-gate.rs:10:16
|
LL | () if (let 0 = 1) => {}
| ^^^^^^^^^
|
= note: see issue #53667 <https://github.com/rust-lang/rust/issues/53667> for more information
= help: add `#![feature(let_chains)]` to the crate attributes to enable
error[E0658]: `let` expressions in this position are unstable
--> $DIR/feature-gate.rs:14:18
|
LL | () if (((let 0 = 1))) => {}
| ^^^^^^^^^
|
= note: see issue #53667 <https://github.com/rust-lang/rust/issues/53667> for more information
= help: add `#![feature(let_chains)]` to the crate attributes to enable
error[E0658]: `let` expressions in this position are unstable
--> $DIR/feature-gate.rs:18:23
--> $DIR/feature-gate.rs:16:23
|
LL | () if true && let 0 = 1 => {}
| ^^^^^^^^^
@ -221,7 +203,7 @@ LL | () if true && let 0 = 1 => {}
= help: add `#![feature(let_chains)]` to the crate attributes to enable
error[E0658]: `let` expressions in this position are unstable
--> $DIR/feature-gate.rs:22:15
--> $DIR/feature-gate.rs:20:15
|
LL | () if let 0 = 1 && true => {}
| ^^^^^^^^^
@ -230,43 +212,7 @@ LL | () if let 0 = 1 && true => {}
= help: add `#![feature(let_chains)]` to the crate attributes to enable
error[E0658]: `let` expressions in this position are unstable
--> $DIR/feature-gate.rs:26:16
|
LL | () if (let 0 = 1) && true => {}
| ^^^^^^^^^
|
= note: see issue #53667 <https://github.com/rust-lang/rust/issues/53667> for more information
= help: add `#![feature(let_chains)]` to the crate attributes to enable
error[E0658]: `let` expressions in this position are unstable
--> $DIR/feature-gate.rs:30:24
|
LL | () if true && (let 0 = 1) => {}
| ^^^^^^^^^
|
= note: see issue #53667 <https://github.com/rust-lang/rust/issues/53667> for more information
= help: add `#![feature(let_chains)]` to the crate attributes to enable
error[E0658]: `let` expressions in this position are unstable
--> $DIR/feature-gate.rs:34:16
|
LL | () if (let 0 = 1) && (let 0 = 1) => {}
| ^^^^^^^^^
|
= note: see issue #53667 <https://github.com/rust-lang/rust/issues/53667> for more information
= help: add `#![feature(let_chains)]` to the crate attributes to enable
error[E0658]: `let` expressions in this position are unstable
--> $DIR/feature-gate.rs:34:31
|
LL | () if (let 0 = 1) && (let 0 = 1) => {}
| ^^^^^^^^^
|
= note: see issue #53667 <https://github.com/rust-lang/rust/issues/53667> for more information
= help: add `#![feature(let_chains)]` to the crate attributes to enable
error[E0658]: `let` expressions in this position are unstable
--> $DIR/feature-gate.rs:40:15
--> $DIR/feature-gate.rs:34:15
|
LL | () if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) => {}
| ^^^^^^^^^
@ -275,7 +221,7 @@ LL | () if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 =
= help: add `#![feature(let_chains)]` to the crate attributes to enable
error[E0658]: `let` expressions in this position are unstable
--> $DIR/feature-gate.rs:40:28
--> $DIR/feature-gate.rs:34:28
|
LL | () if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) => {}
| ^^^^^^^^^
@ -284,34 +230,7 @@ LL | () if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 =
= help: add `#![feature(let_chains)]` to the crate attributes to enable
error[E0658]: `let` expressions in this position are unstable
--> $DIR/feature-gate.rs:40:42
|
LL | () if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) => {}
| ^^^^^^^^^
|
= note: see issue #53667 <https://github.com/rust-lang/rust/issues/53667> for more information
= help: add `#![feature(let_chains)]` to the crate attributes to enable
error[E0658]: `let` expressions in this position are unstable
--> $DIR/feature-gate.rs:40:55
|
LL | () if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) => {}
| ^^^^^^^^^
|
= note: see issue #53667 <https://github.com/rust-lang/rust/issues/53667> for more information
= help: add `#![feature(let_chains)]` to the crate attributes to enable
error[E0658]: `let` expressions in this position are unstable
--> $DIR/feature-gate.rs:40:68
|
LL | () if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) => {}
| ^^^^^^^^^
|
= note: see issue #53667 <https://github.com/rust-lang/rust/issues/53667> for more information
= help: add `#![feature(let_chains)]` to the crate attributes to enable
error[E0658]: `let` expressions in this position are unstable
--> $DIR/feature-gate.rs:52:15
--> $DIR/feature-gate.rs:43:15
|
LL | () if let Range { start: _, end: _ } = (true..true) && false => {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -319,6 +238,6 @@ LL | () if let Range { start: _, end: _ } = (true..true) && false => {}
= note: see issue #53667 <https://github.com/rust-lang/rust/issues/53667> for more information
= help: add `#![feature(let_chains)]` to the crate attributes to enable
error: aborting due to 32 previous errors
error: aborting due to 23 previous errors
For more information about this error, try `rustc --explain E0658`.

View File

@ -0,0 +1,340 @@
// Check that we don't suggest enabling a feature for code that's
// not accepted even with that feature.
#![allow(irrefutable_let_patterns)]
use std::ops::Range;
fn main() {}
fn _if() {
if (let 0 = 1) {}
//~^ ERROR expected expression, found `let` statement
if (((let 0 = 1))) {}
//~^ ERROR expected expression, found `let` statement
if (let 0 = 1) && true {}
//~^ ERROR expected expression, found `let` statement
if true && (let 0 = 1) {}
//~^ ERROR expected expression, found `let` statement
if (let 0 = 1) && (let 0 = 1) {}
//~^ ERROR expected expression, found `let` statement
//~| ERROR expected expression, found `let` statement
if (let 2 = 3 && let 3 = 4 && let 4 = 5) {}
//~^ ERROR expected expression, found `let` statement
//~| ERROR expected expression, found `let` statement
//~| ERROR expected expression, found `let` statement
}
fn _while() {
while (let 0 = 1) {}
//~^ ERROR expected expression, found `let` statement
while (((let 0 = 1))) {}
//~^ ERROR expected expression, found `let` statement
while (let 0 = 1) && true {}
//~^ ERROR expected expression, found `let` statement
while true && (let 0 = 1) {}
//~^ ERROR expected expression, found `let` statement
while (let 0 = 1) && (let 0 = 1) {}
//~^ ERROR expected expression, found `let` statement
//~| ERROR expected expression, found `let` statement
while (let 2 = 3 && let 3 = 4 && let 4 = 5) {}
//~^ ERROR expected expression, found `let` statement
//~| ERROR expected expression, found `let` statement
//~| ERROR expected expression, found `let` statement
}
fn _macros() {
macro_rules! use_expr {
($e:expr) => {
if $e {}
while $e {}
}
}
use_expr!((let 0 = 1 && 0 == 0));
//~^ ERROR expected expression, found `let` statement
use_expr!((let 0 = 1));
//~^ ERROR expected expression, found `let` statement
}
fn nested_within_if_expr() {
if &let 0 = 0 {}
//~^ ERROR expected expression, found `let` statement
if !let 0 = 0 {}
//~^ ERROR expected expression, found `let` statement
if *let 0 = 0 {}
//~^ ERROR expected expression, found `let` statement
if -let 0 = 0 {}
//~^ ERROR expected expression, found `let` statement
fn _check_try_binds_tighter() -> Result<(), ()> {
if let 0 = 0? {}
//~^ ERROR the `?` operator can only be applied to values that implement `Try`
Ok(())
}
if (let 0 = 0)? {}
//~^ ERROR expected expression, found `let` statement
if true || let 0 = 0 {}
//~^ ERROR expected expression, found `let` statement
if (true || let 0 = 0) {}
//~^ ERROR expected expression, found `let` statement
if true && (true || let 0 = 0) {}
//~^ ERROR expected expression, found `let` statement
if true || (true && let 0 = 0) {}
//~^ ERROR expected expression, found `let` statement
let mut x = true;
if x = let 0 = 0 {}
//~^ ERROR expected expression, found `let` statement
if true..(let 0 = 0) {}
//~^ ERROR expected expression, found `let` statement
//~| ERROR mismatched types
if ..(let 0 = 0) {}
//~^ ERROR expected expression, found `let` statement
if (let 0 = 0).. {}
//~^ ERROR expected expression, found `let` statement
// Binds as `(let ... = true)..true &&/|| false`.
if let Range { start: _, end: _ } = true..true && false {}
//~^ ERROR expected expression, found `let` statement
//~| ERROR mismatched types
if let Range { start: _, end: _ } = true..true || false {}
//~^ ERROR expected expression, found `let` statement
//~| ERROR mismatched types
// Binds as `(let Range { start: F, end } = F)..(|| true)`.
const F: fn() -> bool = || true;
if let Range { start: F, end } = F..|| true {}
//~^ ERROR expected expression, found `let` statement
//~| ERROR mismatched types
// Binds as `(let Range { start: true, end } = t)..(&&false)`.
let t = &&true;
if let Range { start: true, end } = t..&&false {}
//~^ ERROR expected expression, found `let` statement
//~| ERROR mismatched types
if let true = let true = true {}
//~^ ERROR expected expression, found `let` statement
}
fn nested_within_while_expr() {
while &let 0 = 0 {}
//~^ ERROR expected expression, found `let` statement
while !let 0 = 0 {}
//~^ ERROR expected expression, found `let` statement
while *let 0 = 0 {}
//~^ ERROR expected expression, found `let` statement
while -let 0 = 0 {}
//~^ ERROR expected expression, found `let` statement
fn _check_try_binds_tighter() -> Result<(), ()> {
while let 0 = 0? {}
//~^ ERROR the `?` operator can only be applied to values that implement `Try`
Ok(())
}
while (let 0 = 0)? {}
//~^ ERROR expected expression, found `let` statement
while true || let 0 = 0 {}
//~^ ERROR expected expression, found `let` statement
while (true || let 0 = 0) {}
//~^ ERROR expected expression, found `let` statement
while true && (true || let 0 = 0) {}
//~^ ERROR expected expression, found `let` statement
while true || (true && let 0 = 0) {}
//~^ ERROR expected expression, found `let` statement
let mut x = true;
while x = let 0 = 0 {}
//~^ ERROR expected expression, found `let` statement
while true..(let 0 = 0) {}
//~^ ERROR expected expression, found `let` statement
//~| ERROR mismatched types
while ..(let 0 = 0) {}
//~^ ERROR expected expression, found `let` statement
while (let 0 = 0).. {}
//~^ ERROR expected expression, found `let` statement
// Binds as `(let ... = true)..true &&/|| false`.
while let Range { start: _, end: _ } = true..true && false {}
//~^ ERROR expected expression, found `let` statement
//~| ERROR mismatched types
while let Range { start: _, end: _ } = true..true || false {}
//~^ ERROR expected expression, found `let` statement
//~| ERROR mismatched types
// Binds as `(let Range { start: F, end } = F)..(|| true)`.
const F: fn() -> bool = || true;
while let Range { start: F, end } = F..|| true {}
//~^ ERROR expected expression, found `let` statement
//~| ERROR mismatched types
// Binds as `(let Range { start: true, end } = t)..(&&false)`.
let t = &&true;
while let Range { start: true, end } = t..&&false {}
//~^ ERROR expected expression, found `let` statement
//~| ERROR mismatched types
while let true = let true = true {}
//~^ ERROR expected expression, found `let` statement
}
fn not_error_because_clarified_intent() {
if let Range { start: _, end: _ } = (true..true || false) { }
if let Range { start: _, end: _ } = (true..true && false) { }
while let Range { start: _, end: _ } = (true..true || false) { }
while let Range { start: _, end: _ } = (true..true && false) { }
}
fn outside_if_and_while_expr() {
&let 0 = 0;
//~^ ERROR expected expression, found `let` statement
!let 0 = 0;
//~^ ERROR expected expression, found `let` statement
*let 0 = 0;
//~^ ERROR expected expression, found `let` statement
-let 0 = 0;
//~^ ERROR expected expression, found `let` statement
let _ = let _ = 3;
//~^ ERROR expected expression, found `let` statement
fn _check_try_binds_tighter() -> Result<(), ()> {
let 0 = 0?;
//~^ ERROR the `?` operator can only be applied to values that implement `Try`
Ok(())
}
(let 0 = 0)?;
//~^ ERROR expected expression, found `let` statement
true || let 0 = 0;
//~^ ERROR expected expression, found `let` statement
(true || let 0 = 0);
//~^ ERROR expected expression, found `let` statement
true && (true || let 0 = 0);
//~^ ERROR expected expression, found `let` statement
let mut x = true;
x = let 0 = 0;
//~^ ERROR expected expression, found `let` statement
true..(let 0 = 0);
//~^ ERROR expected expression, found `let` statement
..(let 0 = 0);
//~^ ERROR expected expression, found `let` statement
(let 0 = 0)..;
//~^ ERROR expected expression, found `let` statement
(let Range { start: _, end: _ } = true..true || false);
//~^ ERROR mismatched types
//~| ERROR expected expression, found `let` statement
(let true = let true = true);
//~^ ERROR expected expression, found `let` statement
//~| ERROR expected expression, found `let` statement
{
#[cfg(FALSE)]
let x = true && let y = 1;
//~^ ERROR expected expression, found `let` statement
}
#[cfg(FALSE)]
{
[1, 2, 3][let _ = ()]
//~^ ERROR expected expression, found `let` statement
}
// Check function tail position.
&let 0 = 0
//~^ ERROR expected expression, found `let` statement
}
// Let's make sure that `let` inside const generic arguments are considered.
fn inside_const_generic_arguments() {
struct A<const B: bool>;
impl<const B: bool> A<{B}> { const O: u32 = 5; }
if let A::<{
true && let 1 = 1
//~^ ERROR expected expression, found `let` statement
}>::O = 5 {}
while let A::<{
true && let 1 = 1
//~^ ERROR expected expression, found `let` statement
}>::O = 5 {}
if A::<{
true && let 1 = 1
//~^ ERROR expected expression, found `let` statement
}>::O == 5 {}
// In the cases above we have `ExprKind::Block` to help us out.
// Below however, we would not have a block and so an implementation might go
// from visiting expressions to types without banning `let` expressions down the tree.
// This tests ensures that we are not caught by surprise should the parser
// admit non-IDENT expressions in const generic arguments.
if A::<
true && let 1 = 1
//~^ ERROR expressions must be enclosed in braces
//~| ERROR expected expression, found `let` statement
>::O == 5 {}
}
fn with_parenthesis() {
let opt = Some(Some(1i32));
if (let Some(a) = opt && true) {
//~^ ERROR expected expression, found `let` statement
}
if (let Some(a) = opt) && true {
//~^ ERROR expected expression, found `let` statement
}
if (let Some(a) = opt) && (let Some(b) = a) {
//~^ ERROR expected expression, found `let` statement
//~| ERROR expected expression, found `let` statement
}
if (let Some(a) = opt && (let Some(b) = a)) && b == 1 {
//~^ ERROR expected expression, found `let` statement
//~| ERROR expected expression, found `let` statement
}
if (let Some(a) = opt && (let Some(b) = a)) && true {
//~^ ERROR expected expression, found `let` statement
//~| ERROR expected expression, found `let` statement
}
if (let Some(a) = opt && (true)) && true {
//~^ ERROR expected expression, found `let` statement
}
#[cfg(FALSE)]
let x = (true && let y = 1);
//~^ ERROR expected expression, found `let` statement
#[cfg(FALSE)]
{
([1, 2, 3][let _ = ()])
//~^ ERROR expected expression, found `let` statement
}
}

View File

@ -0,0 +1,870 @@
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:11:9
|
LL | if (let 0 = 1) {}
| ^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/disallowed-positions-without-feature-gate.rs:11:9
|
LL | if (let 0 = 1) {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:14:11
|
LL | if (((let 0 = 1))) {}
| ^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/disallowed-positions-without-feature-gate.rs:14:11
|
LL | if (((let 0 = 1))) {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:17:9
|
LL | if (let 0 = 1) && true {}
| ^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/disallowed-positions-without-feature-gate.rs:17:9
|
LL | if (let 0 = 1) && true {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:20:17
|
LL | if true && (let 0 = 1) {}
| ^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/disallowed-positions-without-feature-gate.rs:20:17
|
LL | if true && (let 0 = 1) {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:23:9
|
LL | if (let 0 = 1) && (let 0 = 1) {}
| ^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/disallowed-positions-without-feature-gate.rs:23:9
|
LL | if (let 0 = 1) && (let 0 = 1) {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:23:24
|
LL | if (let 0 = 1) && (let 0 = 1) {}
| ^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/disallowed-positions-without-feature-gate.rs:23:24
|
LL | if (let 0 = 1) && (let 0 = 1) {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:27:9
|
LL | if (let 2 = 3 && let 3 = 4 && let 4 = 5) {}
| ^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/disallowed-positions-without-feature-gate.rs:27:9
|
LL | if (let 2 = 3 && let 3 = 4 && let 4 = 5) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:27:22
|
LL | if (let 2 = 3 && let 3 = 4 && let 4 = 5) {}
| ^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/disallowed-positions-without-feature-gate.rs:27:9
|
LL | if (let 2 = 3 && let 3 = 4 && let 4 = 5) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:27:35
|
LL | if (let 2 = 3 && let 3 = 4 && let 4 = 5) {}
| ^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/disallowed-positions-without-feature-gate.rs:27:9
|
LL | if (let 2 = 3 && let 3 = 4 && let 4 = 5) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:34:12
|
LL | while (let 0 = 1) {}
| ^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/disallowed-positions-without-feature-gate.rs:34:12
|
LL | while (let 0 = 1) {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:37:14
|
LL | while (((let 0 = 1))) {}
| ^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/disallowed-positions-without-feature-gate.rs:37:14
|
LL | while (((let 0 = 1))) {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:40:12
|
LL | while (let 0 = 1) && true {}
| ^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/disallowed-positions-without-feature-gate.rs:40:12
|
LL | while (let 0 = 1) && true {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:43:20
|
LL | while true && (let 0 = 1) {}
| ^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/disallowed-positions-without-feature-gate.rs:43:20
|
LL | while true && (let 0 = 1) {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:46:12
|
LL | while (let 0 = 1) && (let 0 = 1) {}
| ^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/disallowed-positions-without-feature-gate.rs:46:12
|
LL | while (let 0 = 1) && (let 0 = 1) {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:46:27
|
LL | while (let 0 = 1) && (let 0 = 1) {}
| ^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/disallowed-positions-without-feature-gate.rs:46:27
|
LL | while (let 0 = 1) && (let 0 = 1) {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:50:12
|
LL | while (let 2 = 3 && let 3 = 4 && let 4 = 5) {}
| ^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/disallowed-positions-without-feature-gate.rs:50:12
|
LL | while (let 2 = 3 && let 3 = 4 && let 4 = 5) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:50:25
|
LL | while (let 2 = 3 && let 3 = 4 && let 4 = 5) {}
| ^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/disallowed-positions-without-feature-gate.rs:50:12
|
LL | while (let 2 = 3 && let 3 = 4 && let 4 = 5) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:50:38
|
LL | while (let 2 = 3 && let 3 = 4 && let 4 = 5) {}
| ^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/disallowed-positions-without-feature-gate.rs:50:12
|
LL | while (let 2 = 3 && let 3 = 4 && let 4 = 5) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:70:9
|
LL | if &let 0 = 0 {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:73:9
|
LL | if !let 0 = 0 {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:75:9
|
LL | if *let 0 = 0 {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:77:9
|
LL | if -let 0 = 0 {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:85:9
|
LL | if (let 0 = 0)? {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:88:16
|
LL | if true || let 0 = 0 {}
| ^^^^^^^^^
|
note: `||` operators are not supported in let chain expressions
--> $DIR/disallowed-positions-without-feature-gate.rs:88:13
|
LL | if true || let 0 = 0 {}
| ^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:90:17
|
LL | if (true || let 0 = 0) {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:92:25
|
LL | if true && (true || let 0 = 0) {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:94:25
|
LL | if true || (true && let 0 = 0) {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:98:12
|
LL | if x = let 0 = 0 {}
| ^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:101:15
|
LL | if true..(let 0 = 0) {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:104:11
|
LL | if ..(let 0 = 0) {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:106:9
|
LL | if (let 0 = 0).. {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:110:8
|
LL | if let Range { start: _, end: _ } = true..true && false {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:113:8
|
LL | if let Range { start: _, end: _ } = true..true || false {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:119:8
|
LL | if let Range { start: F, end } = F..|| true {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:125:8
|
LL | if let Range { start: true, end } = t..&&false {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:129:19
|
LL | if let true = let true = true {}
| ^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:134:12
|
LL | while &let 0 = 0 {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:137:12
|
LL | while !let 0 = 0 {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:139:12
|
LL | while *let 0 = 0 {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:141:12
|
LL | while -let 0 = 0 {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:149:12
|
LL | while (let 0 = 0)? {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:152:19
|
LL | while true || let 0 = 0 {}
| ^^^^^^^^^
|
note: `||` operators are not supported in let chain expressions
--> $DIR/disallowed-positions-without-feature-gate.rs:152:16
|
LL | while true || let 0 = 0 {}
| ^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:154:20
|
LL | while (true || let 0 = 0) {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:156:28
|
LL | while true && (true || let 0 = 0) {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:158:28
|
LL | while true || (true && let 0 = 0) {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:162:15
|
LL | while x = let 0 = 0 {}
| ^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:165:18
|
LL | while true..(let 0 = 0) {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:168:14
|
LL | while ..(let 0 = 0) {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:170:12
|
LL | while (let 0 = 0).. {}
| ^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:174:11
|
LL | while let Range { start: _, end: _ } = true..true && false {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:177:11
|
LL | while let Range { start: _, end: _ } = true..true || false {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:183:11
|
LL | while let Range { start: F, end } = F..|| true {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:189:11
|
LL | while let Range { start: true, end } = t..&&false {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:193:22
|
LL | while let true = let true = true {}
| ^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:208:6
|
LL | &let 0 = 0;
| ^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:211:6
|
LL | !let 0 = 0;
| ^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:213:6
|
LL | *let 0 = 0;
| ^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:215:6
|
LL | -let 0 = 0;
| ^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:217:13
|
LL | let _ = let _ = 3;
| ^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:225:6
|
LL | (let 0 = 0)?;
| ^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:228:13
|
LL | true || let 0 = 0;
| ^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:230:14
|
LL | (true || let 0 = 0);
| ^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:232:22
|
LL | true && (true || let 0 = 0);
| ^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:236:9
|
LL | x = let 0 = 0;
| ^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:239:12
|
LL | true..(let 0 = 0);
| ^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:241:8
|
LL | ..(let 0 = 0);
| ^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:243:6
|
LL | (let 0 = 0)..;
| ^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:246:6
|
LL | (let Range { start: _, end: _ } = true..true || false);
| ^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:250:6
|
LL | (let true = let true = true);
| ^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:250:17
|
LL | (let true = let true = true);
| ^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:256:25
|
LL | let x = true && let y = 1;
| ^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:262:19
|
LL | [1, 2, 3][let _ = ()]
| ^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:267:6
|
LL | &let 0 = 0
| ^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:277:17
|
LL | true && let 1 = 1
| ^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:282:17
|
LL | true && let 1 = 1
| ^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:287:17
|
LL | true && let 1 = 1
| ^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:298:17
|
LL | true && let 1 = 1
| ^^^
error: expressions must be enclosed in braces to be used as const generic arguments
--> $DIR/disallowed-positions-without-feature-gate.rs:298:9
|
LL | true && let 1 = 1
| ^^^^^^^^^^^^^^^^^
|
help: enclose the `const` expression in braces
|
LL | { true && let 1 = 1 }
| + +
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:307:9
|
LL | if (let Some(a) = opt && true) {
| ^^^^^^^^^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/disallowed-positions-without-feature-gate.rs:307:9
|
LL | if (let Some(a) = opt && true) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:311:9
|
LL | if (let Some(a) = opt) && true {
| ^^^^^^^^^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/disallowed-positions-without-feature-gate.rs:311:9
|
LL | if (let Some(a) = opt) && true {
| ^^^^^^^^^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:314:9
|
LL | if (let Some(a) = opt) && (let Some(b) = a) {
| ^^^^^^^^^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/disallowed-positions-without-feature-gate.rs:314:9
|
LL | if (let Some(a) = opt) && (let Some(b) = a) {
| ^^^^^^^^^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:314:32
|
LL | if (let Some(a) = opt) && (let Some(b) = a) {
| ^^^^^^^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/disallowed-positions-without-feature-gate.rs:314:32
|
LL | if (let Some(a) = opt) && (let Some(b) = a) {
| ^^^^^^^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:319:9
|
LL | if (let Some(a) = opt && (let Some(b) = a)) && b == 1 {
| ^^^^^^^^^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/disallowed-positions-without-feature-gate.rs:319:9
|
LL | if (let Some(a) = opt && (let Some(b) = a)) && b == 1 {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:319:31
|
LL | if (let Some(a) = opt && (let Some(b) = a)) && b == 1 {
| ^^^^^^^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/disallowed-positions-without-feature-gate.rs:319:31
|
LL | if (let Some(a) = opt && (let Some(b) = a)) && b == 1 {
| ^^^^^^^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:323:9
|
LL | if (let Some(a) = opt && (let Some(b) = a)) && true {
| ^^^^^^^^^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/disallowed-positions-without-feature-gate.rs:323:9
|
LL | if (let Some(a) = opt && (let Some(b) = a)) && true {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:323:31
|
LL | if (let Some(a) = opt && (let Some(b) = a)) && true {
| ^^^^^^^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/disallowed-positions-without-feature-gate.rs:323:31
|
LL | if (let Some(a) = opt && (let Some(b) = a)) && true {
| ^^^^^^^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:327:9
|
LL | if (let Some(a) = opt && (true)) && true {
| ^^^^^^^^^^^^^^^^^
|
note: `let`s wrapped in parentheses are not supported in a context with let chains
--> $DIR/disallowed-positions-without-feature-gate.rs:327:9
|
LL | if (let Some(a) = opt && (true)) && true {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:332:22
|
LL | let x = (true && let y = 1);
| ^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:337:20
|
LL | ([1, 2, 3][let _ = ()])
| ^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:63:16
|
LL | use_expr!((let 0 = 1 && 0 == 0));
| ^^^
error: expected expression, found `let` statement
--> $DIR/disallowed-positions-without-feature-gate.rs:65:16
|
LL | use_expr!((let 0 = 1));
| ^^^
error[E0308]: mismatched types
--> $DIR/disallowed-positions-without-feature-gate.rs:101:8
|
LL | if true..(let 0 = 0) {}
| ^^^^^^^^^^^^^^^^^ expected `bool`, found `Range<bool>`
|
= note: expected type `bool`
found struct `std::ops::Range<bool>`
error[E0308]: mismatched types
--> $DIR/disallowed-positions-without-feature-gate.rs:110:12
|
LL | if let Range { start: _, end: _ } = true..true && false {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ ---- this expression has type `bool`
| |
| expected `bool`, found `Range<_>`
|
= note: expected type `bool`
found struct `std::ops::Range<_>`
error[E0308]: mismatched types
--> $DIR/disallowed-positions-without-feature-gate.rs:113:12
|
LL | if let Range { start: _, end: _ } = true..true || false {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ ---- this expression has type `bool`
| |
| expected `bool`, found `Range<_>`
|
= note: expected type `bool`
found struct `std::ops::Range<_>`
error[E0308]: mismatched types
--> $DIR/disallowed-positions-without-feature-gate.rs:119:12
|
LL | if let Range { start: F, end } = F..|| true {}
| ^^^^^^^^^^^^^^^^^^^^^^^ - this expression has type `fn() -> bool`
| |
| expected fn pointer, found `Range<_>`
|
= note: expected fn pointer `fn() -> bool`
found struct `std::ops::Range<_>`
error[E0308]: mismatched types
--> $DIR/disallowed-positions-without-feature-gate.rs:125:12
|
LL | if let Range { start: true, end } = t..&&false {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ - this expression has type `&&bool`
| |
| expected `bool`, found `Range<_>`
|
= note: expected type `bool`
found struct `std::ops::Range<_>`
error[E0277]: the `?` operator can only be applied to values that implement `Try`
--> $DIR/disallowed-positions-without-feature-gate.rs:81:20
|
LL | if let 0 = 0? {}
| ^^ the `?` operator cannot be applied to type `{integer}`
|
= help: the trait `Try` is not implemented for `{integer}`
error[E0308]: mismatched types
--> $DIR/disallowed-positions-without-feature-gate.rs:165:11
|
LL | while true..(let 0 = 0) {}
| ^^^^^^^^^^^^^^^^^ expected `bool`, found `Range<bool>`
|
= note: expected type `bool`
found struct `std::ops::Range<bool>`
error[E0308]: mismatched types
--> $DIR/disallowed-positions-without-feature-gate.rs:174:15
|
LL | while let Range { start: _, end: _ } = true..true && false {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ ---- this expression has type `bool`
| |
| expected `bool`, found `Range<_>`
|
= note: expected type `bool`
found struct `std::ops::Range<_>`
error[E0308]: mismatched types
--> $DIR/disallowed-positions-without-feature-gate.rs:177:15
|
LL | while let Range { start: _, end: _ } = true..true || false {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ ---- this expression has type `bool`
| |
| expected `bool`, found `Range<_>`
|
= note: expected type `bool`
found struct `std::ops::Range<_>`
error[E0308]: mismatched types
--> $DIR/disallowed-positions-without-feature-gate.rs:183:15
|
LL | while let Range { start: F, end } = F..|| true {}
| ^^^^^^^^^^^^^^^^^^^^^^^ - this expression has type `fn() -> bool`
| |
| expected fn pointer, found `Range<_>`
|
= note: expected fn pointer `fn() -> bool`
found struct `std::ops::Range<_>`
error[E0308]: mismatched types
--> $DIR/disallowed-positions-without-feature-gate.rs:189:15
|
LL | while let Range { start: true, end } = t..&&false {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ - this expression has type `&&bool`
| |
| expected `bool`, found `Range<_>`
|
= note: expected type `bool`
found struct `std::ops::Range<_>`
error[E0277]: the `?` operator can only be applied to values that implement `Try`
--> $DIR/disallowed-positions-without-feature-gate.rs:145:23
|
LL | while let 0 = 0? {}
| ^^ the `?` operator cannot be applied to type `{integer}`
|
= help: the trait `Try` is not implemented for `{integer}`
error[E0308]: mismatched types
--> $DIR/disallowed-positions-without-feature-gate.rs:246:10
|
LL | (let Range { start: _, end: _ } = true..true || false);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ ---- this expression has type `bool`
| |
| expected `bool`, found `Range<_>`
|
= note: expected type `bool`
found struct `std::ops::Range<_>`
error[E0277]: the `?` operator can only be applied to values that implement `Try`
--> $DIR/disallowed-positions-without-feature-gate.rs:221:17
|
LL | let 0 = 0?;
| ^^ the `?` operator cannot be applied to type `{integer}`
|
= help: the trait `Try` is not implemented for `{integer}`
error: aborting due to 105 previous errors
Some errors have detailed explanations: E0277, E0308.
For more information about an error, try `rustc --explain E0277`.