diff options
| author | bors <bors@rust-lang.org> | 2019-06-23 12:28:12 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2019-06-23 12:28:12 +0000 |
| commit | 5d677b2efdb00031564d30ee9f63f4d4f936a39f (patch) | |
| tree | cf7f1b1a463a8a5ebbd802bd9cb61fe10d3fea0a /src/test | |
| parent | a96ba969156d257e5d5b692946fa8fe40ed6543a (diff) | |
| parent | c75f7ecaee508c568c0bc01c102965ce8b2246ef (diff) | |
| download | rust-5d677b2efdb00031564d30ee9f63f4d4f936a39f.tar.gz rust-5d677b2efdb00031564d30ee9f63f4d4f936a39f.zip | |
Auto merge of #60861 - Centril:let-chains-ast-intro, r=petrochenkov
[let_chains, 2/6] Introduce `Let(..)` in AST, remove IfLet + WhileLet and parse let chains
Here we remove `ast::ExprKind::{IfLet, WhileLet}` and introduce `ast::ExprKind::Let`.
Moreover, we also:
+ connect the parsing logic for let chains
+ introduce the feature gate
+ rewire HIR lowering a bit.
However, this does not connect the new syntax to semantics in HIR.
That will be the subject of a subsequent PR.
Per https://github.com/rust-lang/rust/issues/53667#issuecomment-471583239.
Next step after https://github.com/rust-lang/rust/pull/59288.
cc @Manishearth re. Clippy.
r? @oli-obk
Diffstat (limited to 'src/test')
14 files changed, 2007 insertions, 215 deletions
diff --git a/src/test/run-pass-fulldeps/pprust-expr-roundtrip.rs b/src/test/run-pass-fulldeps/pprust-expr-roundtrip.rs index 7e819e2b34e..5716e6d45a0 100644 --- a/src/test/run-pass-fulldeps/pprust-expr-roundtrip.rs +++ b/src/test/run-pass-fulldeps/pprust-expr-roundtrip.rs @@ -68,7 +68,7 @@ fn iter_exprs(depth: usize, f: &mut dyn FnMut(P<Expr>)) { let mut g = |e| f(expr(e)); - for kind in 0 .. 16 { + for kind in 0..=19 { match kind { 0 => iter_exprs(depth - 1, &mut |e| g(ExprKind::Box(e))), 1 => iter_exprs(depth - 1, &mut |e| g(ExprKind::Call(e, vec![]))), @@ -79,25 +79,26 @@ fn iter_exprs(depth: usize, f: &mut dyn FnMut(P<Expr>)) { iter_exprs(depth - 1, &mut |e| g(ExprKind::MethodCall( seg.clone(), vec![make_x(), e]))); }, - 3 => { - let op = Spanned { span: DUMMY_SP, node: BinOpKind::Add }; - iter_exprs(depth - 1, &mut |e| g(ExprKind::Binary(op, e, make_x()))); - iter_exprs(depth - 1, &mut |e| g(ExprKind::Binary(op, make_x(), e))); - }, - 4 => { - let op = Spanned { span: DUMMY_SP, node: BinOpKind::Mul }; - iter_exprs(depth - 1, &mut |e| g(ExprKind::Binary(op, e, make_x()))); - iter_exprs(depth - 1, &mut |e| g(ExprKind::Binary(op, make_x(), e))); - }, - 5 => { - let op = Spanned { span: DUMMY_SP, node: BinOpKind::Shl }; + 3..=8 => { + let op = Spanned { + span: DUMMY_SP, + node: match kind { + 3 => BinOpKind::Add, + 4 => BinOpKind::Mul, + 5 => BinOpKind::Shl, + 6 => BinOpKind::And, + 7 => BinOpKind::Or, + 8 => BinOpKind::Lt, + _ => unreachable!(), + } + }; iter_exprs(depth - 1, &mut |e| g(ExprKind::Binary(op, e, make_x()))); iter_exprs(depth - 1, &mut |e| g(ExprKind::Binary(op, make_x(), e))); }, - 6 => { + 9 => { iter_exprs(depth - 1, &mut |e| g(ExprKind::Unary(UnOp::Deref, e))); }, - 7 => { + 10 => { let block = P(Block { stmts: Vec::new(), id: DUMMY_NODE_ID, @@ -106,7 +107,7 @@ fn iter_exprs(depth: usize, f: &mut dyn FnMut(P<Expr>)) { }); iter_exprs(depth - 1, &mut |e| g(ExprKind::If(e, block.clone(), None))); }, - 8 => { + 11 => { let decl = P(FnDecl { inputs: vec![], output: FunctionRetTy::Default(DUMMY_SP), @@ -120,33 +121,41 @@ fn iter_exprs(depth: usize, f: &mut dyn FnMut(P<Expr>)) { e, DUMMY_SP))); }, - 9 => { + 12 => { iter_exprs(depth - 1, &mut |e| g(ExprKind::Assign(e, make_x()))); iter_exprs(depth - 1, &mut |e| g(ExprKind::Assign(make_x(), e))); }, - 10 => { + 13 => { iter_exprs(depth - 1, &mut |e| g(ExprKind::Field(e, Ident::from_str("f")))); }, - 11 => { + 14 => { iter_exprs(depth - 1, &mut |e| g(ExprKind::Range( Some(e), Some(make_x()), RangeLimits::HalfOpen))); iter_exprs(depth - 1, &mut |e| g(ExprKind::Range( Some(make_x()), Some(e), RangeLimits::HalfOpen))); }, - 12 => { + 15 => { iter_exprs(depth - 1, &mut |e| g(ExprKind::AddrOf(Mutability::Immutable, e))); }, - 13 => { + 16 => { g(ExprKind::Ret(None)); iter_exprs(depth - 1, &mut |e| g(ExprKind::Ret(Some(e)))); }, - 14 => { + 17 => { let path = Path::from_ident(Ident::from_str("S")); g(ExprKind::Struct(path, vec![], Some(make_x()))); }, - 15 => { + 18 => { iter_exprs(depth - 1, &mut |e| g(ExprKind::Try(e))); }, + 19 => { + let ps = vec![P(Pat { + id: DUMMY_NODE_ID, + node: PatKind::Wild, + span: DUMMY_SP, + })]; + iter_exprs(depth - 1, &mut |e| g(ExprKind::Let(ps.clone(), e))) + }, _ => panic!("bad counter value in iter_exprs"), } } diff --git a/src/test/ui/lint/lint-unnecessary-parens.rs b/src/test/ui/lint/lint-unnecessary-parens.rs index dc74d69bd8d..c36101043a7 100644 --- a/src/test/ui/lint/lint-unnecessary-parens.rs +++ b/src/test/ui/lint/lint-unnecessary-parens.rs @@ -22,8 +22,8 @@ fn main() { match (true) { //~ ERROR unnecessary parentheses around `match` head expression _ => {} } - if let 1 = (1) {} //~ ERROR unnecessary parentheses around `if let` head expression - while let 1 = (2) {} //~ ERROR unnecessary parentheses around `while let` head expression + if let 1 = (1) {} //~ ERROR unnecessary parentheses around `let` head expression + while let 1 = (2) {} //~ ERROR unnecessary parentheses around `let` head expression let v = X { y: false }; // struct lits needs parens, so these shouldn't warn. if (v == X { y: true }) {} diff --git a/src/test/ui/lint/lint-unnecessary-parens.stderr b/src/test/ui/lint/lint-unnecessary-parens.stderr index fe2ee38eb42..dfbefd7b03e 100644 --- a/src/test/ui/lint/lint-unnecessary-parens.stderr +++ b/src/test/ui/lint/lint-unnecessary-parens.stderr @@ -40,13 +40,13 @@ error: unnecessary parentheses around `match` head expression LL | match (true) { | ^^^^^^ help: remove these parentheses -error: unnecessary parentheses around `if let` head expression +error: unnecessary parentheses around `let` head expression --> $DIR/lint-unnecessary-parens.rs:25:16 | LL | if let 1 = (1) {} | ^^^ help: remove these parentheses -error: unnecessary parentheses around `while let` head expression +error: unnecessary parentheses around `let` head expression --> $DIR/lint-unnecessary-parens.rs:26:19 | LL | while let 1 = (2) {} diff --git a/src/test/ui/rfc-2497-if-let-chains/ast-pretty-check.rs b/src/test/ui/rfc-2497-if-let-chains/ast-pretty-check.rs new file mode 100644 index 00000000000..e66d4657566 --- /dev/null +++ b/src/test/ui/rfc-2497-if-let-chains/ast-pretty-check.rs @@ -0,0 +1,6 @@ +// compile-pass +// compile-flags: -Z unpretty=expanded + +fn main() { + if let 0 = 1 {} +} diff --git a/src/test/ui/rfc-2497-if-let-chains/ast-pretty-check.stdout b/src/test/ui/rfc-2497-if-let-chains/ast-pretty-check.stdout new file mode 100644 index 00000000000..a6b15f9bbf6 --- /dev/null +++ b/src/test/ui/rfc-2497-if-let-chains/ast-pretty-check.stdout @@ -0,0 +1,10 @@ +#![feature(prelude_import)] +#![no_std] +#[prelude_import] +use ::std::prelude::v1::*; +#[macro_use] +extern crate std; +// compile-pass +// compile-flags: -Z unpretty=expanded + +fn main() { if let 0 = 1 { } } diff --git a/src/test/ui/rfc-2497-if-let-chains/disallowed-positions.rs b/src/test/ui/rfc-2497-if-let-chains/disallowed-positions.rs new file mode 100644 index 00000000000..7d1e5c3d64d --- /dev/null +++ b/src/test/ui/rfc-2497-if-let-chains/disallowed-positions.rs @@ -0,0 +1,244 @@ +// Here we test that `lowering` behaves correctly wrt. `let $pats = $expr` expressions. +// +// We want to make sure that `let` is banned in situations other than: +// +// expr = +// | ... +// | "if" expr_with_let block {"else" block}? +// | {label ":"}? while" expr_with_let block +// ; +// +// expr_with_let = +// | "let" top_pats "=" expr +// | expr_with_let "&&" expr_with_let +// | "(" expr_with_let ")" +// | expr +// ; +// +// To that end, we check some positions which is not part of the language above. + +#![feature(const_generics)] +//~^ WARN the feature `const_generics` is incomplete +#![feature(let_chains)] // Avoid inflating `.stderr` with overzealous gates in this test. +//~^ WARN the feature `let_chains` is incomplete + +#![allow(irrefutable_let_patterns)] + +use std::ops::Range; + +fn main() {} + +fn nested_within_if_expr() { + if &let 0 = 0 {} //~ ERROR `let` expressions are not supported here + //~^ ERROR mismatched types + + if !let 0 = 0 {} //~ ERROR `let` expressions are not supported here + if *let 0 = 0 {} //~ ERROR `let` expressions are not supported here + //~^ ERROR type `bool` cannot be dereferenced + if -let 0 = 0 {} //~ ERROR `let` expressions are not supported here + //~^ ERROR cannot apply unary operator `-` to type `bool` + + fn _check_try_binds_tighter() -> Result<(), ()> { + if let 0 = 0? {} + //~^ ERROR the `?` operator can only be applied to values that implement `std::ops::Try` + Ok(()) + } + if (let 0 = 0)? {} //~ ERROR `let` expressions are not supported here + //~^ ERROR the `?` operator can only be applied to values that implement `std::ops::Try` + //~| ERROR the `?` operator can only be used in a function that returns `Result` + + if true || let 0 = 0 {} //~ ERROR `let` expressions are not supported here + if (true || let 0 = 0) {} //~ ERROR `let` expressions are not supported here + if true && (true || let 0 = 0) {} //~ ERROR `let` expressions are not supported here + if true || (true && let 0 = 0) {} //~ ERROR `let` expressions are not supported here + + let mut x = true; + if x = let 0 = 0 {} //~ ERROR `let` expressions are not supported here + //~^ ERROR mismatched types + + if true..(let 0 = 0) {} //~ ERROR `let` expressions are not supported here + //~^ ERROR mismatched types + if ..(let 0 = 0) {} //~ ERROR `let` expressions are not supported here + //~^ ERROR mismatched types + if (let 0 = 0).. {} //~ ERROR `let` expressions are not supported here + //~^ ERROR mismatched types + + // Binds as `(let ... = true)..true &&/|| false`. + if let Range { start: _, end: _ } = true..true && false {} + //~^ ERROR `let` expressions are not supported here + //~| ERROR mismatched types + //~| ERROR mismatched types + if let Range { start: _, end: _ } = true..true || false {} + //~^ ERROR `let` expressions are not supported here + //~| ERROR mismatched types + //~| 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 `let` expressions are not supported here + //~| ERROR mismatched types + //~| ERROR mismatched types + //~| ERROR mismatched types + + // Binds as `(let Range { start: true, end } = t)..(&&false)`. + let t = &&true; + if let Range { start: true, end } = t..&&false {} + //~^ ERROR `let` expressions are not supported here + //~| ERROR mismatched types + //~| ERROR mismatched types + //~| ERROR mismatched types + + if let true = let true = true {} //~ ERROR `let` expressions are not supported here +} + +fn nested_within_while_expr() { + while &let 0 = 0 {} //~ ERROR `let` expressions are not supported here + //~^ ERROR mismatched types + + while !let 0 = 0 {} //~ ERROR `let` expressions are not supported here + while *let 0 = 0 {} //~ ERROR `let` expressions are not supported here + //~^ ERROR type `bool` cannot be dereferenced + while -let 0 = 0 {} //~ ERROR `let` expressions are not supported here + //~^ ERROR cannot apply unary operator `-` to type `bool` + + fn _check_try_binds_tighter() -> Result<(), ()> { + while let 0 = 0? {} + //~^ ERROR the `?` operator can only be applied to values that implement `std::ops::Try` + Ok(()) + } + while (let 0 = 0)? {} //~ ERROR `let` expressions are not supported here + //~^ ERROR the `?` operator can only be applied to values that implement `std::ops::Try` + //~| ERROR the `?` operator can only be used in a function that returns `Result` + + while true || let 0 = 0 {} //~ ERROR `let` expressions are not supported here + while (true || let 0 = 0) {} //~ ERROR `let` expressions are not supported here + while true && (true || let 0 = 0) {} //~ ERROR `let` expressions are not supported here + while true || (true && let 0 = 0) {} //~ ERROR `let` expressions are not supported here + + let mut x = true; + while x = let 0 = 0 {} //~ ERROR `let` expressions are not supported here + //~^ ERROR mismatched types + + while true..(let 0 = 0) {} //~ ERROR `let` expressions are not supported here + //~^ ERROR mismatched types + while ..(let 0 = 0) {} //~ ERROR `let` expressions are not supported here + //~^ ERROR mismatched types + while (let 0 = 0).. {} //~ ERROR `let` expressions are not supported here + //~^ ERROR mismatched types + + // Binds as `(let ... = true)..true &&/|| false`. + while let Range { start: _, end: _ } = true..true && false {} + //~^ ERROR `let` expressions are not supported here + //~| ERROR mismatched types + //~| ERROR mismatched types + while let Range { start: _, end: _ } = true..true || false {} + //~^ ERROR `let` expressions are not supported here + //~| ERROR mismatched types + //~| 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 `let` expressions are not supported here + //~| ERROR mismatched types + //~| ERROR mismatched types + //~| ERROR mismatched types + + // Binds as `(let Range { start: true, end } = t)..(&&false)`. + let t = &&true; + while let Range { start: true, end } = t..&&false {} + //~^ ERROR `let` expressions are not supported here + //~| ERROR mismatched types + //~| ERROR mismatched types + //~| ERROR mismatched types + + while let true = let true = true {} //~ ERROR `let` expressions are not supported here +} + +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 `let` expressions are not supported here + + !let 0 = 0; //~ ERROR `let` expressions are not supported here + *let 0 = 0; //~ ERROR `let` expressions are not supported here + //~^ ERROR type `bool` cannot be dereferenced + -let 0 = 0; //~ ERROR `let` expressions are not supported here + //~^ ERROR cannot apply unary operator `-` to type `bool` + + fn _check_try_binds_tighter() -> Result<(), ()> { + let 0 = 0?; + //~^ ERROR the `?` operator can only be applied to values that implement `std::ops::Try` + Ok(()) + } + (let 0 = 0)?; //~ ERROR `let` expressions are not supported here + //~^ ERROR the `?` operator can only be used in a function that returns `Result` + //~| ERROR the `?` operator can only be applied to values that implement `std::ops::Try` + + true || let 0 = 0; //~ ERROR `let` expressions are not supported here + (true || let 0 = 0); //~ ERROR `let` expressions are not supported here + true && (true || let 0 = 0); //~ ERROR `let` expressions are not supported here + + let mut x = true; + x = let 0 = 0; //~ ERROR `let` expressions are not supported here + + true..(let 0 = 0); //~ ERROR `let` expressions are not supported here + ..(let 0 = 0); //~ ERROR `let` expressions are not supported here + (let 0 = 0)..; //~ ERROR `let` expressions are not supported here + + (let Range { start: _, end: _ } = true..true || false); + //~^ ERROR `let` expressions are not supported here + //~| ERROR mismatched types + + (let true = let true = true); + //~^ ERROR `let` expressions are not supported here + //~| ERROR `let` expressions are not supported here + + // Check function tail position. + &let 0 = 0 + //~^ ERROR `let` expressions are not supported here + //~| ERROR mismatched types +} + +// 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 `let` expressions are not supported here + //~^ ERROR constant contains unimplemented expression type + //~| ERROR constant contains unimplemented expression type + }>::O = 5 {} + + while let A::<{ + true && let 1 = 1 //~ ERROR `let` expressions are not supported here + //~^ ERROR constant contains unimplemented expression type + //~| ERROR constant contains unimplemented expression type + }>::O = 5 {} + + if A::<{ + true && let 1 = 1 //~ ERROR `let` expressions are not supported here + //~^ ERROR constant contains unimplemented expression type + //~| ERROR constant contains unimplemented expression type + }>::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 expected one of `,` or `>`, found `&&` + >::O == 5 {} +} diff --git a/src/test/ui/rfc-2497-if-let-chains/disallowed-positions.stderr b/src/test/ui/rfc-2497-if-let-chains/disallowed-positions.stderr new file mode 100644 index 00000000000..207d0d6d6b8 --- /dev/null +++ b/src/test/ui/rfc-2497-if-let-chains/disallowed-positions.stderr @@ -0,0 +1,987 @@ +error: expected one of `,` or `>`, found `&&` + --> $DIR/disallowed-positions.rs:242:14 + | +LL | true && let 1 = 1 + | ^^ expected one of `,` or `>` here + +warning: the feature `const_generics` is incomplete and may cause the compiler to crash + --> $DIR/disallowed-positions.rs:20:12 + | +LL | #![feature(const_generics)] + | ^^^^^^^^^^^^^^ + +warning: the feature `let_chains` is incomplete and may cause the compiler to crash + --> $DIR/disallowed-positions.rs:22:12 + | +LL | #![feature(let_chains)] // Avoid inflating `.stderr` with overzealous gates in this test. + | ^^^^^^^^^^ + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:32:9 + | +LL | if &let 0 = 0 {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:35:9 + | +LL | if !let 0 = 0 {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:36:9 + | +LL | if *let 0 = 0 {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:38:9 + | +LL | if -let 0 = 0 {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:46:9 + | +LL | if (let 0 = 0)? {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:50:16 + | +LL | if true || let 0 = 0 {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:51:17 + | +LL | if (true || let 0 = 0) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:52:25 + | +LL | if true && (true || let 0 = 0) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:53:25 + | +LL | if true || (true && let 0 = 0) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:56:12 + | +LL | if x = let 0 = 0 {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:59:15 + | +LL | if true..(let 0 = 0) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:61:11 + | +LL | if ..(let 0 = 0) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:63:9 + | +LL | if (let 0 = 0).. {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:67:8 + | +LL | if let Range { start: _, end: _ } = true..true && false {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:71:8 + | +LL | if let Range { start: _, end: _ } = true..true || false {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:78:8 + | +LL | if let Range { start: F, end } = F..|| true {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:86:8 + | +LL | if let Range { start: true, end } = t..&&false {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:92:19 + | +LL | if let true = let true = true {} + | ^^^^^^^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:96:12 + | +LL | while &let 0 = 0 {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:99:12 + | +LL | while !let 0 = 0 {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:100:12 + | +LL | while *let 0 = 0 {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:102:12 + | +LL | while -let 0 = 0 {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:110:12 + | +LL | while (let 0 = 0)? {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:114:19 + | +LL | while true || let 0 = 0 {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:115:20 + | +LL | while (true || let 0 = 0) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:116:28 + | +LL | while true && (true || let 0 = 0) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:117:28 + | +LL | while true || (true && let 0 = 0) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:120:15 + | +LL | while x = let 0 = 0 {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:123:18 + | +LL | while true..(let 0 = 0) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:125:14 + | +LL | while ..(let 0 = 0) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:127:12 + | +LL | while (let 0 = 0).. {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:131:11 + | +LL | while let Range { start: _, end: _ } = true..true && false {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:135:11 + | +LL | while let Range { start: _, end: _ } = true..true || false {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:142:11 + | +LL | while let Range { start: F, end } = F..|| true {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:150:11 + | +LL | while let Range { start: true, end } = t..&&false {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:156:22 + | +LL | while let true = let true = true {} + | ^^^^^^^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:170:6 + | +LL | &let 0 = 0; + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:172:6 + | +LL | !let 0 = 0; + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:173:6 + | +LL | *let 0 = 0; + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:175:6 + | +LL | -let 0 = 0; + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:183:6 + | +LL | (let 0 = 0)?; + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:187:13 + | +LL | true || let 0 = 0; + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:188:14 + | +LL | (true || let 0 = 0); + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:189:22 + | +LL | true && (true || let 0 = 0); + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:192:9 + | +LL | x = let 0 = 0; + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:194:12 + | +LL | true..(let 0 = 0); + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:195:8 + | +LL | ..(let 0 = 0); + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:196:6 + | +LL | (let 0 = 0)..; + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:198:6 + | +LL | (let Range { start: _, end: _ } = true..true || false); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:202:6 + | +LL | (let true = let true = true); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:202:17 + | +LL | (let true = let true = true); + | ^^^^^^^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:207:6 + | +LL | &let 0 = 0 + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:218:17 + | +LL | true && let 1 = 1 + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:224:17 + | +LL | true && let 1 = 1 + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/disallowed-positions.rs:230:17 + | +LL | true && let 1 = 1 + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:32:8 + | +LL | if &let 0 = 0 {} + | ^^^^^^^^^^ expected bool, found &bool + | + = note: expected type `bool` + found type `&bool` + +error[E0614]: type `bool` cannot be dereferenced + --> $DIR/disallowed-positions.rs:36:8 + | +LL | if *let 0 = 0 {} + | ^^^^^^^^^^ + +error[E0600]: cannot apply unary operator `-` to type `bool` + --> $DIR/disallowed-positions.rs:38:8 + | +LL | if -let 0 = 0 {} + | ^^^^^^^^^^ cannot apply unary operator `-` + | + = note: an implementation of `std::ops::Neg` might be missing for `bool` + +error[E0277]: the `?` operator can only be applied to values that implement `std::ops::Try` + --> $DIR/disallowed-positions.rs:46:8 + | +LL | if (let 0 = 0)? {} + | ^^^^^^^^^^^^ the `?` operator cannot be applied to type `bool` + | + = help: the trait `std::ops::Try` is not implemented for `bool` + = note: required by `std::ops::Try::into_result` + +error[E0277]: the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `std::ops::Try`) + --> $DIR/disallowed-positions.rs:46:8 + | +LL | if (let 0 = 0)? {} + | ^^^^^^^^^^^^ cannot use the `?` operator in a function that returns `()` + | + = help: the trait `std::ops::Try` is not implemented for `()` + = note: required by `std::ops::Try::from_error` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:56:8 + | +LL | if x = let 0 = 0 {} + | ^^^^^^^^^^^^^ + | | + | expected bool, found () + | help: try comparing for equality: `x == let 0 = 0` + | + = note: expected type `bool` + found type `()` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:59:8 + | +LL | if true..(let 0 = 0) {} + | ^^^^^^^^^^^^^^^^^ expected bool, found struct `std::ops::Range` + | + = note: expected type `bool` + found type `std::ops::Range<bool>` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:61:8 + | +LL | if ..(let 0 = 0) {} + | ^^^^^^^^^^^^^ expected bool, found struct `std::ops::RangeTo` + | + = note: expected type `bool` + found type `std::ops::RangeTo<bool>` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:63:8 + | +LL | if (let 0 = 0).. {} + | ^^^^^^^^^^^^^ expected bool, found struct `std::ops::RangeFrom` + | + = note: expected type `bool` + found type `std::ops::RangeFrom<bool>` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:67:12 + | +LL | if let Range { start: _, end: _ } = true..true && false {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ ---- this match expression has type `bool` + | | + | expected bool, found struct `std::ops::Range` + | + = note: expected type `bool` + found type `std::ops::Range<_>` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:67:8 + | +LL | if let Range { start: _, end: _ } = true..true && false {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected bool, found struct `std::ops::Range` + | + = note: expected type `bool` + found type `std::ops::Range<bool>` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:71:12 + | +LL | if let Range { start: _, end: _ } = true..true || false {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ ---- this match expression has type `bool` + | | + | expected bool, found struct `std::ops::Range` + | + = note: expected type `bool` + found type `std::ops::Range<_>` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:71:8 + | +LL | if let Range { start: _, end: _ } = true..true || false {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected bool, found struct `std::ops::Range` + | + = note: expected type `bool` + found type `std::ops::Range<bool>` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:78:12 + | +LL | if let Range { start: F, end } = F..|| true {} + | ^^^^^^^^^^^^^^^^^^^^^^^ expected fn pointer, found struct `std::ops::Range` + | + = note: expected type `fn() -> bool` + found type `std::ops::Range<_>` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:78:41 + | +LL | if let Range { start: F, end } = F..|| true {} + | ^^^^^^^ expected bool, found closure + | + = note: expected type `bool` + found type `[closure@$DIR/disallowed-positions.rs:78:41: 78:48]` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:78:8 + | +LL | if let Range { start: F, end } = F..|| true {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected bool, found struct `std::ops::Range` + | + = note: expected type `bool` + found type `std::ops::Range<bool>` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:86:12 + | +LL | if let Range { start: true, end } = t..&&false {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - this match expression has type `bool` + | | + | expected bool, found struct `std::ops::Range` + | + = note: expected type `bool` + found type `std::ops::Range<_>` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:86:44 + | +LL | if let Range { start: true, end } = t..&&false {} + | ^^^^^^^ expected bool, found &&bool + | + = note: expected type `bool` + found type `&&bool` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:86:8 + | +LL | if let Range { start: true, end } = t..&&false {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected bool, found struct `std::ops::Range` + | + = note: expected type `bool` + found type `std::ops::Range<bool>` + +error[E0277]: the `?` operator can only be applied to values that implement `std::ops::Try` + --> $DIR/disallowed-positions.rs:42:20 + | +LL | if let 0 = 0? {} + | ^^ the `?` operator cannot be applied to type `{integer}` + | + = help: the trait `std::ops::Try` is not implemented for `{integer}` + = note: required by `std::ops::Try::into_result` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:96:11 + | +LL | while &let 0 = 0 {} + | ^^^^^^^^^^ expected bool, found &bool + | + = note: expected type `bool` + found type `&bool` + +error[E0614]: type `bool` cannot be dereferenced + --> $DIR/disallowed-positions.rs:100:11 + | +LL | while *let 0 = 0 {} + | ^^^^^^^^^^ + +error[E0600]: cannot apply unary operator `-` to type `bool` + --> $DIR/disallowed-positions.rs:102:11 + | +LL | while -let 0 = 0 {} + | ^^^^^^^^^^ cannot apply unary operator `-` + | + = note: an implementation of `std::ops::Neg` might be missing for `bool` + +error[E0277]: the `?` operator can only be applied to values that implement `std::ops::Try` + --> $DIR/disallowed-positions.rs:110:11 + | +LL | while (let 0 = 0)? {} + | ^^^^^^^^^^^^ the `?` operator cannot be applied to type `bool` + | + = help: the trait `std::ops::Try` is not implemented for `bool` + = note: required by `std::ops::Try::into_result` + +error[E0277]: the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `std::ops::Try`) + --> $DIR/disallowed-positions.rs:110:11 + | +LL | while (let 0 = 0)? {} + | ^^^^^^^^^^^^ cannot use the `?` operator in a function that returns `()` + | + = help: the trait `std::ops::Try` is not implemented for `()` + = note: required by `std::ops::Try::from_error` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:120:11 + | +LL | while x = let 0 = 0 {} + | ^^^^^^^^^^^^^ + | | + | expected bool, found () + | help: try comparing for equality: `x == let 0 = 0` + | + = note: expected type `bool` + found type `()` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:123:11 + | +LL | while true..(let 0 = 0) {} + | ^^^^^^^^^^^^^^^^^ expected bool, found struct `std::ops::Range` + | + = note: expected type `bool` + found type `std::ops::Range<bool>` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:125:11 + | +LL | while ..(let 0 = 0) {} + | ^^^^^^^^^^^^^ expected bool, found struct `std::ops::RangeTo` + | + = note: expected type `bool` + found type `std::ops::RangeTo<bool>` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:127:11 + | +LL | while (let 0 = 0).. {} + | ^^^^^^^^^^^^^ expected bool, found struct `std::ops::RangeFrom` + | + = note: expected type `bool` + found type `std::ops::RangeFrom<bool>` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:131:15 + | +LL | while let Range { start: _, end: _ } = true..true && false {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ ---- this match expression has type `bool` + | | + | expected bool, found struct `std::ops::Range` + | + = note: expected type `bool` + found type `std::ops::Range<_>` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:131:11 + | +LL | while let Range { start: _, end: _ } = true..true && false {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected bool, found struct `std::ops::Range` + | + = note: expected type `bool` + found type `std::ops::Range<bool>` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:135:15 + | +LL | while let Range { start: _, end: _ } = true..true || false {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ ---- this match expression has type `bool` + | | + | expected bool, found struct `std::ops::Range` + | + = note: expected type `bool` + found type `std::ops::Range<_>` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:135:11 + | +LL | while let Range { start: _, end: _ } = true..true || false {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected bool, found struct `std::ops::Range` + | + = note: expected type `bool` + found type `std::ops::Range<bool>` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:142:15 + | +LL | while let Range { start: F, end } = F..|| true {} + | ^^^^^^^^^^^^^^^^^^^^^^^ expected fn pointer, found struct `std::ops::Range` + | + = note: expected type `fn() -> bool` + found type `std::ops::Range<_>` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:142:44 + | +LL | while let Range { start: F, end } = F..|| true {} + | ^^^^^^^ expected bool, found closure + | + = note: expected type `bool` + found type `[closure@$DIR/disallowed-positions.rs:142:44: 142:51]` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:142:11 + | +LL | while let Range { start: F, end } = F..|| true {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected bool, found struct `std::ops::Range` + | + = note: expected type `bool` + found type `std::ops::Range<bool>` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:150:15 + | +LL | while let Range { start: true, end } = t..&&false {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - this match expression has type `bool` + | | + | expected bool, found struct `std::ops::Range` + | + = note: expected type `bool` + found type `std::ops::Range<_>` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:150:47 + | +LL | while let Range { start: true, end } = t..&&false {} + | ^^^^^^^ expected bool, found &&bool + | + = note: expected type `bool` + found type `&&bool` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:150:11 + | +LL | while let Range { start: true, end } = t..&&false {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected bool, found struct `std::ops::Range` + | + = note: expected type `bool` + found type `std::ops::Range<bool>` + +error[E0277]: the `?` operator can only be applied to values that implement `std::ops::Try` + --> $DIR/disallowed-positions.rs:106:23 + | +LL | while let 0 = 0? {} + | ^^ the `?` operator cannot be applied to type `{integer}` + | + = help: the trait `std::ops::Try` is not implemented for `{integer}` + = note: required by `std::ops::Try::into_result` + +error[E0614]: type `bool` cannot be dereferenced + --> $DIR/disallowed-positions.rs:173:5 + | +LL | *let 0 = 0; + | ^^^^^^^^^^ + +error[E0600]: cannot apply unary operator `-` to type `bool` + --> $DIR/disallowed-positions.rs:175:5 + | +LL | -let 0 = 0; + | ^^^^^^^^^^ cannot apply unary operator `-` + | + = note: an implementation of `std::ops::Neg` might be missing for `bool` + +error[E0277]: the `?` operator can only be applied to values that implement `std::ops::Try` + --> $DIR/disallowed-positions.rs:183:5 + | +LL | (let 0 = 0)?; + | ^^^^^^^^^^^^ the `?` operator cannot be applied to type `bool` + | + = help: the trait `std::ops::Try` is not implemented for `bool` + = note: required by `std::ops::Try::into_result` + +error[E0277]: the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `std::ops::Try`) + --> $DIR/disallowed-positions.rs:183:5 + | +LL | (let 0 = 0)?; + | ^^^^^^^^^^^^ cannot use the `?` operator in a function that returns `()` + | + = help: the trait `std::ops::Try` is not implemented for `()` + = note: required by `std::ops::Try::from_error` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:198:10 + | +LL | (let Range { start: _, end: _ } = true..true || false); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ ---- this match expression has type `bool` + | | + | expected bool, found struct `std::ops::Range` + | + = note: expected type `bool` + found type `std::ops::Range<_>` + +error[E0308]: mismatched types + --> $DIR/disallowed-positions.rs:207:5 + | +LL | fn outside_if_and_while_expr() { + | - help: try adding a return type: `-> &bool` +... +LL | &let 0 = 0 + | ^^^^^^^^^^ expected (), found &bool + | + = note: expected type `()` + found type `&bool` + +error[E0277]: the `?` operator can only be applied to values that implement `std::ops::Try` + --> $DIR/disallowed-positions.rs:179:17 + | +LL | let 0 = 0?; + | ^^ the `?` operator cannot be applied to type `{integer}` + | + = help: the trait `std::ops::Try` is not implemented for `{integer}` + = note: required by `std::ops::Try::into_result` + +error[E0019]: constant contains unimplemented expression type + --> $DIR/disallowed-positions.rs:218:25 + | +LL | true && let 1 = 1 + | ^ + +error[E0019]: constant contains unimplemented expression type + --> $DIR/disallowed-positions.rs:218:21 + | +LL | true && let 1 = 1 + | ^ + +error[E0019]: constant contains unimplemented expression type + --> $DIR/disallowed-positions.rs:224:25 + | +LL | true && let 1 = 1 + | ^ + +error[E0019]: constant contains unimplemented expression type + --> $DIR/disallowed-positions.rs:224:21 + | +LL | true && let 1 = 1 + | ^ + +error[E0019]: constant contains unimplemented expression type + --> $DIR/disallowed-positions.rs:230:25 + | +LL | true && let 1 = 1 + | ^ + +error[E0019]: constant contains unimplemented expression type + --> $DIR/disallowed-positions.rs:230:21 + | +LL | true && let 1 = 1 + | ^ + +error: aborting due to 109 previous errors + +Some errors have detailed explanations: E0019, E0277, E0308, E0600, E0614. +For more information about an error, try `rustc --explain E0019`. diff --git a/src/test/ui/rfc-2497-if-let-chains/feature-gate.rs b/src/test/ui/rfc-2497-if-let-chains/feature-gate.rs new file mode 100644 index 00000000000..64987663adb --- /dev/null +++ b/src/test/ui/rfc-2497-if-let-chains/feature-gate.rs @@ -0,0 +1,136 @@ +// gate-test-let_chains + +// Here we test feature gating for ´let_chains`. +// See `disallowed-positions.rs` for the grammar +// defining the language for gated allowed positions. + +#![allow(irrefutable_let_patterns)] + +use std::ops::Range; + +fn _if() { + if let 0 = 1 {} // Stable! + + if (let 0 = 1) {} + //~^ ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions are not supported here + + if (((let 0 = 1))) {} + //~^ ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions are not supported here + + if true && let 0 = 1 {} + //~^ ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions are not supported here + + if let 0 = 1 && true {} + //~^ ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions are not supported here + + if (let 0 = 1) && true {} + //~^ ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions are not supported here + + if true && (let 0 = 1) {} + //~^ ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions are not supported here + + if (let 0 = 1) && (let 0 = 1) {} + //~^ ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions are not supported here + //~| ERROR `let` expressions are not supported here + + if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} + //~^ ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions are not supported here + //~| ERROR `let` expressions are not supported here + //~| ERROR `let` expressions are not supported here + //~| ERROR `let` expressions are not supported here + //~| ERROR `let` expressions are not supported here + + if let Range { start: _, end: _ } = (true..true) && false {} + //~^ ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions are not supported here +} + +fn _while() { + while let 0 = 1 {} // Stable! + + while (let 0 = 1) {} + //~^ ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions are not supported here + + while (((let 0 = 1))) {} + //~^ ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions are not supported here + + while true && let 0 = 1 {} + //~^ ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions are not supported here + + while let 0 = 1 && true {} + //~^ ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions are not supported here + + while (let 0 = 1) && true {} + //~^ ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions are not supported here + + while true && (let 0 = 1) {} + //~^ ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions are not supported here + + while (let 0 = 1) && (let 0 = 1) {} + //~^ ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions are not supported here + //~| ERROR `let` expressions are not supported here + + while let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} + //~^ ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions are not supported here + //~| ERROR `let` expressions are not supported here + //~| ERROR `let` expressions are not supported here + //~| ERROR `let` expressions are not supported here + //~| ERROR `let` expressions are not supported here + + while let Range { start: _, end: _ } = (true..true) && false {} + //~^ ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions are not supported here +} + +fn _macros() { + macro_rules! noop_expr { ($e:expr) => {}; } + + noop_expr!((let 0 = 1)); + //~^ ERROR `let` expressions in this position are experimental [E0658] + + macro_rules! use_expr { + ($e:expr) => { + if $e {} + while $e {} + } + } + use_expr!((let 0 = 1 && 0 == 0)); + //~^ ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions are not supported here + use_expr!((let 0 = 1)); + //~^ ERROR `let` expressions in this position are experimental [E0658] + //~| ERROR `let` expressions are not supported here + #[cfg(FALSE)] (let 0 = 1); + //~^ ERROR `let` expressions in this position are experimental [E0658] + use_expr!(let 0 = 1); + //~^ ERROR no rules expected the token `let` + // ^--- FIXME(53667): Consider whether `Let` can be added to `ident_can_begin_expr`. +} + +fn main() {} diff --git a/src/test/ui/rfc-2497-if-let-chains/feature-gate.stderr b/src/test/ui/rfc-2497-if-let-chains/feature-gate.stderr new file mode 100644 index 00000000000..6167427fa9f --- /dev/null +++ b/src/test/ui/rfc-2497-if-let-chains/feature-gate.stderr @@ -0,0 +1,570 @@ +error: no rules expected the token `let` + --> $DIR/feature-gate.rs:131:15 + | +LL | macro_rules! use_expr { + | --------------------- when calling this macro +... +LL | use_expr!(let 0 = 1); + | ^^^ no rules expected this token in macro call + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:14:9 + | +LL | if (let 0 = 1) {} + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:18:11 + | +LL | if (((let 0 = 1))) {} + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:22:16 + | +LL | if true && let 0 = 1 {} + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:26:8 + | +LL | if let 0 = 1 && true {} + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:30:9 + | +LL | if (let 0 = 1) && true {} + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:34:17 + | +LL | if true && (let 0 = 1) {} + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:38:9 + | +LL | if (let 0 = 1) && (let 0 = 1) {} + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:38:24 + | +LL | if (let 0 = 1) && (let 0 = 1) {} + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:44:8 + | +LL | if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:44:21 + | +LL | if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:44:35 + | +LL | if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:44:48 + | +LL | if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:44:61 + | +LL | if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:56:8 + | +LL | if let Range { start: _, end: _ } = (true..true) && false {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:64:12 + | +LL | while (let 0 = 1) {} + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:68:14 + | +LL | while (((let 0 = 1))) {} + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:72:19 + | +LL | while true && let 0 = 1 {} + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:76:11 + | +LL | while let 0 = 1 && true {} + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:80:12 + | +LL | while (let 0 = 1) && true {} + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:84:20 + | +LL | while true && (let 0 = 1) {} + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:88:12 + | +LL | while (let 0 = 1) && (let 0 = 1) {} + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:88:27 + | +LL | while (let 0 = 1) && (let 0 = 1) {} + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:94:11 + | +LL | while let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:94:24 + | +LL | while let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:94:38 + | +LL | while let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:94:51 + | +LL | while let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:94:64 + | +LL | while let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:106:11 + | +LL | while let Range { start: _, end: _ } = (true..true) && false {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:129:20 + | +LL | #[cfg(FALSE)] (let 0 = 1); + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:114:17 + | +LL | noop_expr!((let 0 = 1)); + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:123:16 + | +LL | use_expr!((let 0 = 1 && 0 == 0)); + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error[E0658]: `let` expressions in this position are experimental + --> $DIR/feature-gate.rs:126:16 + | +LL | use_expr!((let 0 = 1)); + | ^^^^^^^^^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/53667 + = help: add #![feature(let_chains)] to the crate attributes to enable + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:14:9 + | +LL | if (let 0 = 1) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:18:11 + | +LL | if (((let 0 = 1))) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:22:16 + | +LL | if true && let 0 = 1 {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:26:8 + | +LL | if let 0 = 1 && true {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:30:9 + | +LL | if (let 0 = 1) && true {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:34:17 + | +LL | if true && (let 0 = 1) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:38:9 + | +LL | if (let 0 = 1) && (let 0 = 1) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:38:24 + | +LL | if (let 0 = 1) && (let 0 = 1) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:44:8 + | +LL | if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:44:21 + | +LL | if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:44:35 + | +LL | if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:44:48 + | +LL | if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:44:61 + | +LL | if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:56:8 + | +LL | if let Range { start: _, end: _ } = (true..true) && false {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:64:12 + | +LL | while (let 0 = 1) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:68:14 + | +LL | while (((let 0 = 1))) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:72:19 + | +LL | while true && let 0 = 1 {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:76:11 + | +LL | while let 0 = 1 && true {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:80:12 + | +LL | while (let 0 = 1) && true {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:84:20 + | +LL | while true && (let 0 = 1) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:88:12 + | +LL | while (let 0 = 1) && (let 0 = 1) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:88:27 + | +LL | while (let 0 = 1) && (let 0 = 1) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:94:11 + | +LL | while let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:94:24 + | +LL | while let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:94:38 + | +LL | while let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:94:51 + | +LL | while let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:94:64 + | +LL | while let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:106:11 + | +LL | while let Range { start: _, end: _ } = (true..true) && false {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:123:16 + | +LL | use_expr!((let 0 = 1 && 0 == 0)); + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: `let` expressions are not supported here + --> $DIR/feature-gate.rs:126:16 + | +LL | use_expr!((let 0 = 1)); + | ^^^^^^^^^ + | + = note: only supported directly in conditions of `if`- and `while`-expressions + = note: as well as when nested within `&&` and parenthesis in those conditions + +error: aborting due to 63 previous errors + +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/rfc-2497-if-let-chains/protect-precedences.rs b/src/test/ui/rfc-2497-if-let-chains/protect-precedences.rs new file mode 100644 index 00000000000..1de4e5bcebe --- /dev/null +++ b/src/test/ui/rfc-2497-if-let-chains/protect-precedences.rs @@ -0,0 +1,18 @@ +// run-pass + +#![allow(irrefutable_let_patterns)] + +use std::ops::Range; + +fn main() { + let x: bool; + // This should associate as: `(x = (true && false));`. + x = true && false; + assert!(!x); + + fn _f1() -> bool { + // Should associate as `(let _ = (return (true && false)))`. + if let _ = return true && false {}; + } + assert!(!_f1()); +} diff --git a/src/test/ui/rfc-2497-if-let-chains/syntax-ambiguity-2015.rs b/src/test/ui/rfc-2497-if-let-chains/syntax-ambiguity-2015.rs deleted file mode 100644 index d79798d57e8..00000000000 --- a/src/test/ui/rfc-2497-if-let-chains/syntax-ambiguity-2015.rs +++ /dev/null @@ -1,38 +0,0 @@ -// edition:2015 - -// Enabling `ireffutable_let_patterns` isn't necessary for what this tests, but it makes coming up -// with examples easier. - -#[allow(irrefutable_let_patterns)] -fn main() { - use std::ops::Range; - - if let Range { start: _, end: _ } = true..true && false { } - //~^ ERROR ambiguous use of `&&` - - if let Range { start: _, end: _ } = true..true || false { } - //~^ ERROR ambiguous use of `||` - - while let Range { start: _, end: _ } = true..true && false { } - //~^ ERROR ambiguous use of `&&` - - while let Range { start: _, end: _ } = true..true || false { } - //~^ ERROR ambiguous use of `||` - - if let true = false && false { } - //~^ ERROR ambiguous use of `&&` - - while let true = (1 == 2) && false { } - //~^ ERROR ambiguous use of `&&` - - // The following cases are not an error as parenthesis are used to - // clarify 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) { } -} diff --git a/src/test/ui/rfc-2497-if-let-chains/syntax-ambiguity-2015.stderr b/src/test/ui/rfc-2497-if-let-chains/syntax-ambiguity-2015.stderr deleted file mode 100644 index 2cd59fe56cf..00000000000 --- a/src/test/ui/rfc-2497-if-let-chains/syntax-ambiguity-2015.stderr +++ /dev/null @@ -1,56 +0,0 @@ -error: ambiguous use of `&&` - --> $DIR/syntax-ambiguity-2015.rs:10:47 - | -LL | if let Range { start: _, end: _ } = true..true && false { } - | ^^^^^^^^^^^^^ help: consider adding parentheses: `(true && false)` - | - = note: this will be a error until the `let_chains` feature is stabilized - = note: see rust-lang/rust#53668 for more information - -error: ambiguous use of `||` - --> $DIR/syntax-ambiguity-2015.rs:13:47 - | -LL | if let Range { start: _, end: _ } = true..true || false { } - | ^^^^^^^^^^^^^ help: consider adding parentheses: `(true || false)` - | - = note: this will be a error until the `let_chains` feature is stabilized - = note: see rust-lang/rust#53668 for more information - -error: ambiguous use of `&&` - --> $DIR/syntax-ambiguity-2015.rs:16:50 - | -LL | while let Range { start: _, end: _ } = true..true && false { } - | ^^^^^^^^^^^^^ help: consider adding parentheses: `(true && false)` - | - = note: this will be a error until the `let_chains` feature is stabilized - = note: see rust-lang/rust#53668 for more information - -error: ambiguous use of `||` - --> $DIR/syntax-ambiguity-2015.rs:19:50 - | -LL | while let Range { start: _, end: _ } = true..true || false { } - | ^^^^^^^^^^^^^ help: consider adding parentheses: `(true || false)` - | - = note: this will be a error until the `let_chains` feature is stabilized - = note: see rust-lang/rust#53668 for more information - -error: ambiguous use of `&&` - --> $DIR/syntax-ambiguity-2015.rs:22:19 - | -LL | if let true = false && false { } - | ^^^^^^^^^^^^^^ help: consider adding parentheses: `(false && false)` - | - = note: this will be a error until the `let_chains` feature is stabilized - = note: see rust-lang/rust#53668 for more information - -error: ambiguous use of `&&` - --> $DIR/syntax-ambiguity-2015.rs:25:22 - | -LL | while let true = (1 == 2) && false { } - | ^^^^^^^^^^^^^^^^^ help: consider adding parentheses: `((1 == 2) && false)` - | - = note: this will be a error until the `let_chains` feature is stabilized - = note: see rust-lang/rust#53668 for more information - -error: aborting due to 6 previous errors - diff --git a/src/test/ui/rfc-2497-if-let-chains/syntax-ambiguity-2018.rs b/src/test/ui/rfc-2497-if-let-chains/syntax-ambiguity-2018.rs deleted file mode 100644 index 687bf659416..00000000000 --- a/src/test/ui/rfc-2497-if-let-chains/syntax-ambiguity-2018.rs +++ /dev/null @@ -1,38 +0,0 @@ -// edition:2018 - -// Enabling `ireffutable_let_patterns` isn't necessary for what this tests, but it makes coming up -// with examples easier. - -#[allow(irrefutable_let_patterns)] -fn main() { - use std::ops::Range; - - if let Range { start: _, end: _ } = true..true && false { } - //~^ ERROR ambiguous use of `&&` - - if let Range { start: _, end: _ } = true..true || false { } - //~^ ERROR ambiguous use of `||` - - while let Range { start: _, end: _ } = true..true && false { } - //~^ ERROR ambiguous use of `&&` - - while let Range { start: _, end: _ } = true..true || false { } - //~^ ERROR ambiguous use of `||` - - if let true = false && false { } - //~^ ERROR ambiguous use of `&&` - - while let true = (1 == 2) && false { } - //~^ ERROR ambiguous use of `&&` - - // The following cases are not an error as parenthesis are used to - // clarify 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) { } -} diff --git a/src/test/ui/rfc-2497-if-let-chains/syntax-ambiguity-2018.stderr b/src/test/ui/rfc-2497-if-let-chains/syntax-ambiguity-2018.stderr deleted file mode 100644 index cbba2d74733..00000000000 --- a/src/test/ui/rfc-2497-if-let-chains/syntax-ambiguity-2018.stderr +++ /dev/null @@ -1,56 +0,0 @@ -error: ambiguous use of `&&` - --> $DIR/syntax-ambiguity-2018.rs:10:47 - | -LL | if let Range { start: _, end: _ } = true..true && false { } - | ^^^^^^^^^^^^^ help: consider adding parentheses: `(true && false)` - | - = note: this will be a error until the `let_chains` feature is stabilized - = note: see rust-lang/rust#53668 for more information - -error: ambiguous use of `||` - --> $DIR/syntax-ambiguity-2018.rs:13:47 - | -LL | if let Range { start: _, end: _ } = true..true || false { } - | ^^^^^^^^^^^^^ help: consider adding parentheses: `(true || false)` - | - = note: this will be a error until the `let_chains` feature is stabilized - = note: see rust-lang/rust#53668 for more information - -error: ambiguous use of `&&` - --> $DIR/syntax-ambiguity-2018.rs:16:50 - | -LL | while let Range { start: _, end: _ } = true..true && false { } - | ^^^^^^^^^^^^^ help: consider adding parentheses: `(true && false)` - | - = note: this will be a error until the `let_chains` feature is stabilized - = note: see rust-lang/rust#53668 for more information - -error: ambiguous use of `||` - --> $DIR/syntax-ambiguity-2018.rs:19:50 - | -LL | while let Range { start: _, end: _ } = true..true || false { } - | ^^^^^^^^^^^^^ help: consider adding parentheses: `(true || false)` - | - = note: this will be a error until the `let_chains` feature is stabilized - = note: see rust-lang/rust#53668 for more information - -error: ambiguous use of `&&` - --> $DIR/syntax-ambiguity-2018.rs:22:19 - | -LL | if let true = false && false { } - | ^^^^^^^^^^^^^^ help: consider adding parentheses: `(false && false)` - | - = note: this will be a error until the `let_chains` feature is stabilized - = note: see rust-lang/rust#53668 for more information - -error: ambiguous use of `&&` - --> $DIR/syntax-ambiguity-2018.rs:25:22 - | -LL | while let true = (1 == 2) && false { } - | ^^^^^^^^^^^^^^^^^ help: consider adding parentheses: `((1 == 2) && false)` - | - = note: this will be a error until the `let_chains` feature is stabilized - = note: see rust-lang/rust#53668 for more information - -error: aborting due to 6 previous errors - |
