1 // Here we test that `ast_validation` behaves correctly wrt. `let $pats = $expr` expressions.
3 // We want to make sure that `let` is banned in situations other than:
7 // | "if" expr_with_let block {"else" block}?
8 // | {label ":"}? while" expr_with_let block
12 // | "let" top_pats "=" expr
13 // | expr_with_let "&&" expr_with_let
14 // | "(" expr_with_let ")"
18 // To that end, we check some positions which is not part of the language above.
20 #![allow(irrefutable_let_patterns)]
26 fn nested_within_if_expr() {
27 if &let 0 = 0 {} //~ ERROR `let` expressions are not supported here
28 //~^ ERROR `let` expressions only supported in `if`
30 if !let 0 = 0 {} //~ ERROR `let` expressions are not supported here
31 if *let 0 = 0 {} //~ ERROR `let` expressions are not supported here
32 if -let 0 = 0 {} //~ ERROR `let` expressions are not supported here
34 fn _check_try_binds_tighter() -> Result<(), ()> {
38 if (let 0 = 0)? {} //~ ERROR `let` expressions are not supported here
40 if true || let 0 = 0 {} //~ ERROR `let` expressions are not supported here
41 if (true || let 0 = 0) {} //~ ERROR `let` expressions are not supported here
42 if true && (true || let 0 = 0) {} //~ ERROR `let` expressions are not supported here
43 if true || (true && let 0 = 0) {} //~ ERROR `let` expressions are not supported here
46 if x = let 0 = 0 {} //~ ERROR `let` expressions are not supported here
48 if true..(let 0 = 0) {} //~ ERROR `let` expressions are not supported here
49 if ..(let 0 = 0) {} //~ ERROR `let` expressions are not supported here
50 if (let 0 = 0).. {} //~ ERROR `let` expressions are not supported here
52 // Binds as `(let ... = true)..true &&/|| false`.
53 if let Range { start: _, end: _ } = true..true && false {}
54 //~^ ERROR `let` expressions are not supported here
55 if let Range { start: _, end: _ } = true..true || false {}
56 //~^ ERROR `let` expressions are not supported here
58 // Binds as `(let Range { start: F, end } = F)..(|| true)`.
59 const F: fn() -> bool = || true;
60 if let Range { start: F, end } = F..|| true {}
61 //~^ ERROR `let` expressions are not supported here
63 // Binds as `(let Range { start: true, end } = t)..(&&false)`.
65 if let Range { start: true, end } = t..&&false {}
66 //~^ ERROR `let` expressions are not supported here
68 if let true = let true = true {} //~ ERROR `let` expressions are not supported here
71 fn nested_within_while_expr() {
72 while &let 0 = 0 {} //~ ERROR `let` expressions are not supported here
74 while !let 0 = 0 {} //~ ERROR `let` expressions are not supported here
75 while *let 0 = 0 {} //~ ERROR `let` expressions are not supported here
76 while -let 0 = 0 {} //~ ERROR `let` expressions are not supported here
78 fn _check_try_binds_tighter() -> Result<(), ()> {
82 while (let 0 = 0)? {} //~ ERROR `let` expressions are not supported here
84 while true || let 0 = 0 {} //~ ERROR `let` expressions are not supported here
85 while (true || let 0 = 0) {} //~ ERROR `let` expressions are not supported here
86 while true && (true || let 0 = 0) {} //~ ERROR `let` expressions are not supported here
87 while true || (true && let 0 = 0) {} //~ ERROR `let` expressions are not supported here
90 while x = let 0 = 0 {} //~ ERROR `let` expressions are not supported here
92 while true..(let 0 = 0) {} //~ ERROR `let` expressions are not supported here
93 while ..(let 0 = 0) {} //~ ERROR `let` expressions are not supported here
94 while (let 0 = 0).. {} //~ ERROR `let` expressions are not supported here
96 // Binds as `(let ... = true)..true &&/|| false`.
97 while let Range { start: _, end: _ } = true..true && false {}
98 //~^ ERROR `let` expressions are not supported here
99 while let Range { start: _, end: _ } = true..true || false {}
100 //~^ ERROR `let` expressions are not supported here
102 // Binds as `(let Range { start: F, end } = F)..(|| true)`.
103 const F: fn() -> bool = || true;
104 while let Range { start: F, end } = F..|| true {}
105 //~^ ERROR `let` expressions are not supported here
107 // Binds as `(let Range { start: true, end } = t)..(&&false)`.
109 while let Range { start: true, end } = t..&&false {}
110 //~^ ERROR `let` expressions are not supported here
112 while let true = let true = true {} //~ ERROR `let` expressions are not supported here
115 fn not_error_because_clarified_intent() {
116 if let Range { start: _, end: _ } = (true..true || false) { }
118 if let Range { start: _, end: _ } = (true..true && false) { }
120 while let Range { start: _, end: _ } = (true..true || false) { }
122 while let Range { start: _, end: _ } = (true..true && false) { }
125 fn outside_if_and_while_expr() {
126 &let 0 = 0; //~ ERROR `let` expressions are not supported here
128 !let 0 = 0; //~ ERROR `let` expressions are not supported here
129 *let 0 = 0; //~ ERROR `let` expressions are not supported here
130 -let 0 = 0; //~ ERROR `let` expressions are not supported here
132 fn _check_try_binds_tighter() -> Result<(), ()> {
136 (let 0 = 0)?; //~ ERROR `let` expressions are not supported here
138 true || let 0 = 0; //~ ERROR `let` expressions are not supported here
139 (true || let 0 = 0); //~ ERROR `let` expressions are not supported here
140 true && (true || let 0 = 0); //~ ERROR `let` expressions are not supported here
143 x = let 0 = 0; //~ ERROR `let` expressions are not supported here
145 true..(let 0 = 0); //~ ERROR `let` expressions are not supported here
146 ..(let 0 = 0); //~ ERROR `let` expressions are not supported here
147 (let 0 = 0)..; //~ ERROR `let` expressions are not supported here
149 (let Range { start: _, end: _ } = true..true || false);
150 //~^ ERROR `let` expressions are not supported here
152 (let true = let true = true);
153 //~^ ERROR `let` expressions are not supported here
154 //~| ERROR `let` expressions are not supported here
156 // Check function tail position.
158 //~^ ERROR `let` expressions are not supported here