Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit b2ecedf

Browse files
authoredMay 22, 2024
Unrolled build for rust-lang#125049
Rollup merge of rust-lang#125049 - dtolnay:castbrace, r=compiler-errors Disallow cast with trailing braced macro in let-else This fixes an edge case I noticed while porting rust-lang#118880 and rust-lang#119062 to syn. Previously, rustc incorrectly accepted code such as: ```rust let foo = &std::ptr::null as &'static dyn std::ops::Fn() -> *const primitive! { 8 } else { return; }; ``` even though a right curl brace `}` directly before `else` in a `let...else` statement is not supposed to be valid syntax.
2 parents 22f5bdc + a36b94d commit b2ecedf

File tree

4 files changed

+209
-297
lines changed

4 files changed

+209
-297
lines changed
 

‎compiler/rustc_ast/src/util/classify.rs

Lines changed: 91 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,17 @@ pub fn expr_requires_semi_to_be_stmt(e: &ast::Expr) -> bool {
8181
}
8282
}
8383

84+
pub enum TrailingBrace<'a> {
85+
/// Trailing brace in a macro call, like the one in `x as *const brace! {}`.
86+
/// We will suggest changing the macro call to a different delimiter.
87+
MacCall(&'a ast::MacCall),
88+
/// Trailing brace in any other expression, such as `a + B {}`. We will
89+
/// suggest wrapping the innermost expression in parentheses: `a + (B {})`.
90+
Expr(&'a ast::Expr),
91+
}
92+
8493
/// If an expression ends with `}`, returns the innermost expression ending in the `}`
85-
pub fn expr_trailing_brace(mut expr: &ast::Expr) -> Option<&ast::Expr> {
94+
pub fn expr_trailing_brace(mut expr: &ast::Expr) -> Option<TrailingBrace<'_>> {
8695
loop {
8796
match &expr.kind {
8897
AddrOf(_, _, e)
@@ -111,10 +120,14 @@ pub fn expr_trailing_brace(mut expr: &ast::Expr) -> Option<&ast::Expr> {
111120
| Struct(..)
112121
| TryBlock(..)
113122
| While(..)
114-
| ConstBlock(_) => break Some(expr),
123+
| ConstBlock(_) => break Some(TrailingBrace::Expr(expr)),
124+
125+
Cast(_, ty) => {
126+
break type_trailing_braced_mac_call(ty).map(TrailingBrace::MacCall);
127+
}
115128

116129
MacCall(mac) => {
117-
break (mac.args.delim == Delimiter::Brace).then_some(expr);
130+
break (mac.args.delim == Delimiter::Brace).then_some(TrailingBrace::MacCall(mac));
118131
}
119132

120133
InlineAsm(_) | OffsetOf(_, _) | IncludedBytes(_) | FormatArgs(_) => {
@@ -131,7 +144,6 @@ pub fn expr_trailing_brace(mut expr: &ast::Expr) -> Option<&ast::Expr> {
131144
| MethodCall(_)
132145
| Tup(_)
133146
| Lit(_)
134-
| Cast(_, _)
135147
| Type(_, _)
136148
| Await(_, _)
137149
| Field(_, _)
@@ -148,3 +160,78 @@ pub fn expr_trailing_brace(mut expr: &ast::Expr) -> Option<&ast::Expr> {
148160
}
149161
}
150162
}
163+
164+
/// If the type's last token is `}`, it must be due to a braced macro call, such
165+
/// as in `*const brace! { ... }`. Returns that trailing macro call.
166+
fn type_trailing_braced_mac_call(mut ty: &ast::Ty) -> Option<&ast::MacCall> {
167+
loop {
168+
match &ty.kind {
169+
ast::TyKind::MacCall(mac) => {
170+
break (mac.args.delim == Delimiter::Brace).then_some(mac);
171+
}
172+
173+
ast::TyKind::Ptr(mut_ty) | ast::TyKind::Ref(_, mut_ty) => {
174+
ty = &mut_ty.ty;
175+
}
176+
177+
ast::TyKind::BareFn(fn_ty) => match &fn_ty.decl.output {
178+
ast::FnRetTy::Default(_) => break None,
179+
ast::FnRetTy::Ty(ret) => ty = ret,
180+
},
181+
182+
ast::TyKind::Path(_, path) => match path_return_type(path) {
183+
Some(trailing_ty) => ty = trailing_ty,
184+
None => break None,
185+
},
186+
187+
ast::TyKind::TraitObject(bounds, _) | ast::TyKind::ImplTrait(_, bounds, _) => {
188+
match bounds.last() {
189+
Some(ast::GenericBound::Trait(bound, _)) => {
190+
match path_return_type(&bound.trait_ref.path) {
191+
Some(trailing_ty) => ty = trailing_ty,
192+
None => break None,
193+
}
194+
}
195+
Some(ast::GenericBound::Outlives(_)) | None => break None,
196+
}
197+
}
198+
199+
ast::TyKind::Slice(..)
200+
| ast::TyKind::Array(..)
201+
| ast::TyKind::Never
202+
| ast::TyKind::Tup(..)
203+
| ast::TyKind::Paren(..)
204+
| ast::TyKind::Typeof(..)
205+
| ast::TyKind::Infer
206+
| ast::TyKind::ImplicitSelf
207+
| ast::TyKind::CVarArgs
208+
| ast::TyKind::Pat(..)
209+
| ast::TyKind::Dummy
210+
| ast::TyKind::Err(..) => break None,
211+
212+
// These end in brace, but cannot occur in a let-else statement.
213+
// They are only parsed as fields of a data structure. For the
214+
// purpose of denying trailing braces in the expression of a
215+
// let-else, we can disregard these.
216+
ast::TyKind::AnonStruct(..) | ast::TyKind::AnonUnion(..) => break None,
217+
}
218+
}
219+
}
220+
221+
/// Returns the trailing return type in the given path, if it has one.
222+
///
223+
/// ```ignore (illustrative)
224+
/// ::std::ops::FnOnce(&str) -> fn() -> *const c_void
225+
/// ^^^^^^^^^^^^^^^^^^^^^
226+
/// ```
227+
fn path_return_type(path: &ast::Path) -> Option<&ast::Ty> {
228+
let last_segment = path.segments.last()?;
229+
let args = last_segment.args.as_ref()?;
230+
match &**args {
231+
ast::GenericArgs::Parenthesized(args) => match &args.output {
232+
ast::FnRetTy::Default(_) => None,
233+
ast::FnRetTy::Ty(ret) => Some(ret),
234+
},
235+
ast::GenericArgs::AngleBracketed(_) => None,
236+
}
237+
}

‎compiler/rustc_parse/src/parser/stmt.rs

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use ast::Label;
1515
use rustc_ast as ast;
1616
use rustc_ast::ptr::P;
1717
use rustc_ast::token::{self, Delimiter, TokenKind};
18-
use rustc_ast::util::classify;
18+
use rustc_ast::util::classify::{self, TrailingBrace};
1919
use rustc_ast::{AttrStyle, AttrVec, LocalKind, MacCall, MacCallStmt, MacStmtStyle};
2020
use rustc_ast::{Block, BlockCheckMode, Expr, ExprKind, HasAttrs, Local, Recovered, Stmt};
2121
use rustc_ast::{StmtKind, DUMMY_NODE_ID};
@@ -407,18 +407,24 @@ impl<'a> Parser<'a> {
407407

408408
fn check_let_else_init_trailing_brace(&self, init: &ast::Expr) {
409409
if let Some(trailing) = classify::expr_trailing_brace(init) {
410-
let sugg = match &trailing.kind {
411-
ExprKind::MacCall(mac) => errors::WrapInParentheses::MacroArgs {
412-
left: mac.args.dspan.open,
413-
right: mac.args.dspan.close,
414-
},
415-
_ => errors::WrapInParentheses::Expression {
416-
left: trailing.span.shrink_to_lo(),
417-
right: trailing.span.shrink_to_hi(),
418-
},
410+
let (span, sugg) = match trailing {
411+
TrailingBrace::MacCall(mac) => (
412+
mac.span(),
413+
errors::WrapInParentheses::MacroArgs {
414+
left: mac.args.dspan.open,
415+
right: mac.args.dspan.close,
416+
},
417+
),
418+
TrailingBrace::Expr(expr) => (
419+
expr.span,
420+
errors::WrapInParentheses::Expression {
421+
left: expr.span.shrink_to_lo(),
422+
right: expr.span.shrink_to_hi(),
423+
},
424+
),
419425
};
420426
self.dcx().emit_err(errors::InvalidCurlyInLetElse {
421-
span: trailing.span.with_lo(trailing.span.hi() - BytePos(1)),
427+
span: span.with_lo(span.hi() - BytePos(1)),
422428
sugg,
423429
});
424430
}

‎tests/ui/parser/bad-let-else-statement.rs

Lines changed: 40 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
#![feature(explicit_tail_calls)]
44

55
fn a() {
6-
let foo = {
7-
//~^ WARN irrefutable `let...else` pattern
6+
let 0 = {
87
1
98
} else {
109
//~^ ERROR right curly brace `}` before `else` in a `let...else` statement not allowed
@@ -22,8 +21,7 @@ fn b() {
2221
}
2322

2423
fn c() {
25-
let foo = if true {
26-
//~^ WARN irrefutable `let...else` pattern
24+
let 0 = if true {
2725
1
2826
} else {
2927
0
@@ -43,8 +41,7 @@ fn d() {
4341
}
4442

4543
fn e() {
46-
let foo = match true {
47-
//~^ WARN irrefutable `let...else` pattern
44+
let 0 = match true {
4845
true => 1,
4946
false => 0
5047
} else {
@@ -53,10 +50,12 @@ fn e() {
5350
};
5451
}
5552

56-
struct X {a: i32}
5753
fn f() {
58-
let foo = X {
59-
//~^ WARN irrefutable `let...else` pattern
54+
struct X {
55+
a: i32,
56+
}
57+
58+
let X { a: 0 } = X {
6059
a: 1
6160
} else {
6261
//~^ ERROR right curly brace `}` before `else` in a `let...else` statement not allowed
@@ -74,8 +73,7 @@ fn g() {
7473
}
7574

7675
fn h() {
77-
let foo = const {
78-
//~^ WARN irrefutable `let...else` pattern
76+
let 0 = const {
7977
1
8078
} else {
8179
//~^ ERROR right curly brace `}` before `else` in a `let...else` statement not allowed
@@ -84,8 +82,7 @@ fn h() {
8482
}
8583

8684
fn i() {
87-
let foo = &{
88-
//~^ WARN irrefutable `let...else` pattern
85+
let 0 = &{
8986
1
9087
} else {
9188
//~^ ERROR right curly brace `}` before `else` in a `let...else` statement not allowed
@@ -94,8 +91,8 @@ fn i() {
9491
}
9592

9693
fn j() {
97-
let bar = 0;
98-
let foo = bar = { //~ ERROR: cannot assign twice
94+
let mut bar = 0;
95+
let foo = bar = {
9996
//~^ WARN irrefutable `let...else` pattern
10097
1
10198
} else {
@@ -105,8 +102,7 @@ fn j() {
105102
}
106103

107104
fn k() {
108-
let foo = 1 + {
109-
//~^ WARN irrefutable `let...else` pattern
105+
let 0 = 1 + {
110106
1
111107
} else {
112108
//~^ ERROR right curly brace `}` before `else` in a `let...else` statement not allowed
@@ -115,8 +111,8 @@ fn k() {
115111
}
116112

117113
fn l() {
118-
let foo = 1..{
119-
//~^ WARN irrefutable `let...else` pattern
114+
const RANGE: std::ops::Range<u8> = 0..0;
115+
let RANGE = 1..{
120116
1
121117
} else {
122118
//~^ ERROR right curly brace `}` before `else` in a `let...else` statement not allowed
@@ -125,8 +121,7 @@ fn l() {
125121
}
126122

127123
fn m() {
128-
let foo = return {
129-
//~^ WARN irrefutable `let...else` pattern
124+
let 0 = return {
130125
()
131126
} else {
132127
//~^ ERROR right curly brace `}` before `else` in a `let...else` statement not allowed
@@ -135,8 +130,7 @@ fn m() {
135130
}
136131

137132
fn n() {
138-
let foo = -{
139-
//~^ WARN irrefutable `let...else` pattern
133+
let 0 = -{
140134
1
141135
} else {
142136
//~^ ERROR right curly brace `}` before `else` in a `let...else` statement not allowed
@@ -145,8 +139,7 @@ fn n() {
145139
}
146140

147141
fn o() -> Result<(), ()> {
148-
let foo = do yeet {
149-
//~^ WARN irrefutable `let...else` pattern
142+
let 0 = do yeet {
150143
()
151144
} else {
152145
//~^ ERROR right curly brace `}` before `else` in a `let...else` statement not allowed
@@ -155,8 +148,7 @@ fn o() -> Result<(), ()> {
155148
}
156149

157150
fn p() {
158-
let foo = become {
159-
//~^ WARN irrefutable `let...else` pattern
151+
let 0 = become {
160152
()
161153
} else {
162154
//~^ ERROR right curly brace `}` before `else` in a `let...else` statement not allowed
@@ -185,22 +177,37 @@ fn r() {
185177

186178
fn s() {
187179
macro_rules! a {
188-
() => { {} }
189-
//~^ WARN irrefutable `let...else` pattern
190-
//~| WARN irrefutable `let...else` pattern
180+
() => {
181+
{ 1 }
182+
};
191183
}
192184

193185
macro_rules! b {
194186
(1) => {
195-
let x = a!() else { return; };
187+
let 0 = a!() else { return; };
196188
};
197189
(2) => {
198-
let x = a! {} else { return; };
190+
let 0 = a! {} else { return; };
199191
//~^ ERROR right curly brace `}` before `else` in a `let...else` statement not allowed
200192
};
201193
}
202194

203-
b!(1); b!(2);
195+
b!(1);
196+
b!(2);
197+
}
198+
199+
fn t() {
200+
macro_rules! primitive {
201+
(8) => { u8 };
202+
}
203+
204+
let foo = &std::ptr::null as &'static dyn std::ops::Fn() -> *const primitive! {
205+
//~^ WARN irrefutable `let...else` pattern
206+
8
207+
} else {
208+
//~^ ERROR right curly brace `}` before `else` in a `let...else` statement not allowed
209+
return;
210+
};
204211
}
205212

206213
fn main() {}
Lines changed: 61 additions & 249 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
11
error: right curly brace `}` before `else` in a `let...else` statement not allowed
2-
--> $DIR/bad-let-else-statement.rs:9:5
2+
--> $DIR/bad-let-else-statement.rs:8:5
33
|
44
LL | } else {
55
| ^
66
|
77
help: wrap the expression in parentheses
88
|
9-
LL ~ let foo = ({
10-
LL |
9+
LL ~ let 0 = ({
1110
LL | 1
1211
LL ~ }) else {
1312
|
1413

1514
error: `for...else` loops are not supported
16-
--> $DIR/bad-let-else-statement.rs:18:7
15+
--> $DIR/bad-let-else-statement.rs:17:7
1716
|
1817
LL | let foo = for i in 1..2 {
1918
| --- `else` is attached to this loop
@@ -28,22 +27,22 @@ LL | | };
2827
= note: consider moving this `else` clause to a separate `if` statement and use a `bool` variable to control if it should run
2928

3029
error: right curly brace `}` before `else` in a `let...else` statement not allowed
31-
--> $DIR/bad-let-else-statement.rs:30:5
30+
--> $DIR/bad-let-else-statement.rs:28:5
3231
|
3332
LL | } else {
3433
| ^
3534
|
3635
help: wrap the expression in parentheses
3736
|
38-
LL ~ let foo = (if true {
39-
LL |
40-
...
37+
LL ~ let 0 = (if true {
38+
LL | 1
39+
LL | } else {
4140
LL | 0
4241
LL ~ }) else {
4342
|
4443

4544
error: `loop...else` loops are not supported
46-
--> $DIR/bad-let-else-statement.rs:39:7
45+
--> $DIR/bad-let-else-statement.rs:37:7
4746
|
4847
LL | let foo = loop {
4948
| ---- `else` is attached to this loop
@@ -58,36 +57,34 @@ LL | | };
5857
= note: consider moving this `else` clause to a separate `if` statement and use a `bool` variable to control if it should run
5958

6059
error: right curly brace `}` before `else` in a `let...else` statement not allowed
61-
--> $DIR/bad-let-else-statement.rs:50:5
60+
--> $DIR/bad-let-else-statement.rs:47:5
6261
|
6362
LL | } else {
6463
| ^
6564
|
6665
help: wrap the expression in parentheses
6766
|
68-
LL ~ let foo = (match true {
69-
LL |
67+
LL ~ let 0 = (match true {
7068
LL | true => 1,
7169
LL | false => 0
7270
LL ~ }) else {
7371
|
7472

7573
error: right curly brace `}` before `else` in a `let...else` statement not allowed
76-
--> $DIR/bad-let-else-statement.rs:61:5
74+
--> $DIR/bad-let-else-statement.rs:60:5
7775
|
7876
LL | } else {
7977
| ^
8078
|
8179
help: wrap the expression in parentheses
8280
|
83-
LL ~ let foo = (X {
84-
LL |
81+
LL ~ let X { a: 0 } = (X {
8582
LL | a: 1
8683
LL ~ }) else {
8784
|
8885

8986
error: `while...else` loops are not supported
90-
--> $DIR/bad-let-else-statement.rs:70:7
87+
--> $DIR/bad-let-else-statement.rs:69:7
9188
|
9289
LL | let foo = while false {
9390
| ----- `else` is attached to this loop
@@ -102,35 +99,33 @@ LL | | };
10299
= note: consider moving this `else` clause to a separate `if` statement and use a `bool` variable to control if it should run
103100

104101
error: right curly brace `}` before `else` in a `let...else` statement not allowed
105-
--> $DIR/bad-let-else-statement.rs:80:5
102+
--> $DIR/bad-let-else-statement.rs:78:5
106103
|
107104
LL | } else {
108105
| ^
109106
|
110107
help: wrap the expression in parentheses
111108
|
112-
LL ~ let foo = (const {
113-
LL |
109+
LL ~ let 0 = (const {
114110
LL | 1
115111
LL ~ }) else {
116112
|
117113

118114
error: right curly brace `}` before `else` in a `let...else` statement not allowed
119-
--> $DIR/bad-let-else-statement.rs:90:5
115+
--> $DIR/bad-let-else-statement.rs:87:5
120116
|
121117
LL | } else {
122118
| ^
123119
|
124120
help: wrap the expression in parentheses
125121
|
126-
LL ~ let foo = &({
127-
LL |
122+
LL ~ let 0 = &({
128123
LL | 1
129124
LL ~ }) else {
130125
|
131126

132127
error: right curly brace `}` before `else` in a `let...else` statement not allowed
133-
--> $DIR/bad-let-else-statement.rs:101:5
128+
--> $DIR/bad-let-else-statement.rs:98:5
134129
|
135130
LL | } else {
136131
| ^
@@ -144,91 +139,85 @@ LL ~ }) else {
144139
|
145140

146141
error: right curly brace `}` before `else` in a `let...else` statement not allowed
147-
--> $DIR/bad-let-else-statement.rs:111:5
142+
--> $DIR/bad-let-else-statement.rs:107:5
148143
|
149144
LL | } else {
150145
| ^
151146
|
152147
help: wrap the expression in parentheses
153148
|
154-
LL ~ let foo = 1 + ({
155-
LL |
149+
LL ~ let 0 = 1 + ({
156150
LL | 1
157151
LL ~ }) else {
158152
|
159153

160154
error: right curly brace `}` before `else` in a `let...else` statement not allowed
161-
--> $DIR/bad-let-else-statement.rs:121:5
155+
--> $DIR/bad-let-else-statement.rs:117:5
162156
|
163157
LL | } else {
164158
| ^
165159
|
166160
help: wrap the expression in parentheses
167161
|
168-
LL ~ let foo = 1..({
169-
LL |
162+
LL ~ let RANGE = 1..({
170163
LL | 1
171164
LL ~ }) else {
172165
|
173166

174167
error: right curly brace `}` before `else` in a `let...else` statement not allowed
175-
--> $DIR/bad-let-else-statement.rs:131:5
168+
--> $DIR/bad-let-else-statement.rs:126:5
176169
|
177170
LL | } else {
178171
| ^
179172
|
180173
help: wrap the expression in parentheses
181174
|
182-
LL ~ let foo = return ({
183-
LL |
175+
LL ~ let 0 = return ({
184176
LL | ()
185177
LL ~ }) else {
186178
|
187179

188180
error: right curly brace `}` before `else` in a `let...else` statement not allowed
189-
--> $DIR/bad-let-else-statement.rs:141:5
181+
--> $DIR/bad-let-else-statement.rs:135:5
190182
|
191183
LL | } else {
192184
| ^
193185
|
194186
help: wrap the expression in parentheses
195187
|
196-
LL ~ let foo = -({
197-
LL |
188+
LL ~ let 0 = -({
198189
LL | 1
199190
LL ~ }) else {
200191
|
201192

202193
error: right curly brace `}` before `else` in a `let...else` statement not allowed
203-
--> $DIR/bad-let-else-statement.rs:151:5
194+
--> $DIR/bad-let-else-statement.rs:144:5
204195
|
205196
LL | } else {
206197
| ^
207198
|
208199
help: wrap the expression in parentheses
209200
|
210-
LL ~ let foo = do yeet ({
211-
LL |
201+
LL ~ let 0 = do yeet ({
212202
LL | ()
213203
LL ~ }) else {
214204
|
215205

216206
error: right curly brace `}` before `else` in a `let...else` statement not allowed
217-
--> $DIR/bad-let-else-statement.rs:161:5
207+
--> $DIR/bad-let-else-statement.rs:153:5
218208
|
219209
LL | } else {
220210
| ^
221211
|
222212
help: wrap the expression in parentheses
223213
|
224-
LL ~ let foo = become ({
225-
LL |
214+
LL ~ let 0 = become ({
226215
LL | ()
227216
LL ~ }) else {
228217
|
229218

230219
error: right curly brace `}` before `else` in a `let...else` statement not allowed
231-
--> $DIR/bad-let-else-statement.rs:171:5
220+
--> $DIR/bad-let-else-statement.rs:163:5
232221
|
233222
LL | } else {
234223
| ^
@@ -242,7 +231,7 @@ LL ~ }) else {
242231
|
243232

244233
error: right curly brace `}` before `else` in a `let...else` statement not allowed
245-
--> $DIR/bad-let-else-statement.rs:181:31
234+
--> $DIR/bad-let-else-statement.rs:173:31
246235
|
247236
LL | let bad = format_args! {""} else { return; };
248237
| ^
@@ -253,98 +242,36 @@ LL | let bad = format_args! ("") else { return; };
253242
| ~ ~
254243

255244
error: right curly brace `}` before `else` in a `let...else` statement not allowed
256-
--> $DIR/bad-let-else-statement.rs:198:25
245+
--> $DIR/bad-let-else-statement.rs:207:5
257246
|
258-
LL | let x = a! {} else { return; };
259-
| ^
260-
...
261-
LL | b!(1); b!(2);
262-
| ----- in this macro invocation
247+
LL | } else {
248+
| ^
263249
|
264-
= note: this error originates in the macro `b` (in Nightly builds, run with -Z macro-backtrace for more info)
265250
help: use parentheses instead of braces for this macro
266251
|
267-
LL | let x = a! () else { return; };
268-
| ~~
269-
270-
warning: irrefutable `let...else` pattern
271-
--> $DIR/bad-let-else-statement.rs:6:5
272-
|
273-
LL | / let foo = {
274-
LL | |
275-
LL | | 1
276-
LL | | } else {
277-
| |_____^
278-
|
279-
= note: this pattern will always match, so the `else` clause is useless
280-
= help: consider removing the `else` clause
281-
= note: `#[warn(irrefutable_let_patterns)]` on by default
282-
283-
warning: irrefutable `let...else` pattern
284-
--> $DIR/bad-let-else-statement.rs:25:5
285-
|
286-
LL | / let foo = if true {
287-
LL | |
288-
LL | | 1
289-
LL | | } else {
290-
LL | | 0
291-
LL | | } else {
292-
| |_____^
293-
|
294-
= note: this pattern will always match, so the `else` clause is useless
295-
= help: consider removing the `else` clause
296-
297-
warning: irrefutable `let...else` pattern
298-
--> $DIR/bad-let-else-statement.rs:46:5
299-
|
300-
LL | / let foo = match true {
301-
LL | |
302-
LL | | true => 1,
303-
LL | | false => 0
304-
LL | | } else {
305-
| |_____^
306-
|
307-
= note: this pattern will always match, so the `else` clause is useless
308-
= help: consider removing the `else` clause
309-
310-
warning: irrefutable `let...else` pattern
311-
--> $DIR/bad-let-else-statement.rs:58:5
312-
|
313-
LL | / let foo = X {
314-
LL | |
315-
LL | | a: 1
316-
LL | | } else {
317-
| |_____^
252+
LL ~ let foo = &std::ptr::null as &'static dyn std::ops::Fn() -> *const primitive! (
253+
LL |
254+
LL | 8
255+
LL ~ ) else {
318256
|
319-
= note: this pattern will always match, so the `else` clause is useless
320-
= help: consider removing the `else` clause
321257

322-
warning: irrefutable `let...else` pattern
323-
--> $DIR/bad-let-else-statement.rs:77:5
324-
|
325-
LL | / let foo = const {
326-
LL | |
327-
LL | | 1
328-
LL | | } else {
329-
| |_____^
258+
error: right curly brace `}` before `else` in a `let...else` statement not allowed
259+
--> $DIR/bad-let-else-statement.rs:190:25
330260
|
331-
= note: this pattern will always match, so the `else` clause is useless
332-
= help: consider removing the `else` clause
333-
334-
warning: irrefutable `let...else` pattern
335-
--> $DIR/bad-let-else-statement.rs:87:5
261+
LL | let 0 = a! {} else { return; };
262+
| ^
263+
...
264+
LL | b!(2);
265+
| ----- in this macro invocation
336266
|
337-
LL | / let foo = &{
338-
LL | |
339-
LL | | 1
340-
LL | | } else {
341-
| |_____^
267+
= note: this error originates in the macro `b` (in Nightly builds, run with -Z macro-backtrace for more info)
268+
help: use parentheses instead of braces for this macro
342269
|
343-
= note: this pattern will always match, so the `else` clause is useless
344-
= help: consider removing the `else` clause
270+
LL | let 0 = a! () else { return; };
271+
| ~~
345272

346273
warning: irrefutable `let...else` pattern
347-
--> $DIR/bad-let-else-statement.rs:98:5
274+
--> $DIR/bad-let-else-statement.rs:95:5
348275
|
349276
LL | / let foo = bar = {
350277
LL | |
@@ -354,96 +281,10 @@ LL | | } else {
354281
|
355282
= note: this pattern will always match, so the `else` clause is useless
356283
= help: consider removing the `else` clause
357-
358-
error[E0384]: cannot assign twice to immutable variable `bar`
359-
--> $DIR/bad-let-else-statement.rs:98:15
360-
|
361-
LL | let bar = 0;
362-
| ---
363-
| |
364-
| first assignment to `bar`
365-
| help: consider making this binding mutable: `mut bar`
366-
LL | let foo = bar = {
367-
| _______________^
368-
LL | |
369-
LL | | 1
370-
LL | | } else {
371-
| |_____^ cannot assign twice to immutable variable
372-
373-
warning: irrefutable `let...else` pattern
374-
--> $DIR/bad-let-else-statement.rs:108:5
375-
|
376-
LL | / let foo = 1 + {
377-
LL | |
378-
LL | | 1
379-
LL | | } else {
380-
| |_____^
381-
|
382-
= note: this pattern will always match, so the `else` clause is useless
383-
= help: consider removing the `else` clause
384-
385-
warning: irrefutable `let...else` pattern
386-
--> $DIR/bad-let-else-statement.rs:118:5
387-
|
388-
LL | / let foo = 1..{
389-
LL | |
390-
LL | | 1
391-
LL | | } else {
392-
| |_____^
393-
|
394-
= note: this pattern will always match, so the `else` clause is useless
395-
= help: consider removing the `else` clause
396-
397-
warning: irrefutable `let...else` pattern
398-
--> $DIR/bad-let-else-statement.rs:128:5
399-
|
400-
LL | / let foo = return {
401-
LL | |
402-
LL | | ()
403-
LL | | } else {
404-
| |_____^
405-
|
406-
= note: this pattern will always match, so the `else` clause is useless
407-
= help: consider removing the `else` clause
408-
409-
warning: irrefutable `let...else` pattern
410-
--> $DIR/bad-let-else-statement.rs:138:5
411-
|
412-
LL | / let foo = -{
413-
LL | |
414-
LL | | 1
415-
LL | | } else {
416-
| |_____^
417-
|
418-
= note: this pattern will always match, so the `else` clause is useless
419-
= help: consider removing the `else` clause
420-
421-
warning: irrefutable `let...else` pattern
422-
--> $DIR/bad-let-else-statement.rs:148:5
423-
|
424-
LL | / let foo = do yeet {
425-
LL | |
426-
LL | | ()
427-
LL | | } else {
428-
| |_____^
429-
|
430-
= note: this pattern will always match, so the `else` clause is useless
431-
= help: consider removing the `else` clause
432-
433-
warning: irrefutable `let...else` pattern
434-
--> $DIR/bad-let-else-statement.rs:158:5
435-
|
436-
LL | / let foo = become {
437-
LL | |
438-
LL | | ()
439-
LL | | } else {
440-
| |_____^
441-
|
442-
= note: this pattern will always match, so the `else` clause is useless
443-
= help: consider removing the `else` clause
284+
= note: `#[warn(irrefutable_let_patterns)]` on by default
444285

445286
warning: irrefutable `let...else` pattern
446-
--> $DIR/bad-let-else-statement.rs:168:5
287+
--> $DIR/bad-let-else-statement.rs:160:5
447288
|
448289
LL | / let foo = |x: i32| {
449290
LL | |
@@ -455,7 +296,7 @@ LL | | } else {
455296
= help: consider removing the `else` clause
456297

457298
warning: irrefutable `let...else` pattern
458-
--> $DIR/bad-let-else-statement.rs:178:5
299+
--> $DIR/bad-let-else-statement.rs:170:5
459300
|
460301
LL | let ok = format_args!("") else { return; };
461302
| ^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -464,7 +305,7 @@ LL | let ok = format_args!("") else { return; };
464305
= help: consider removing the `else` clause
465306

466307
warning: irrefutable `let...else` pattern
467-
--> $DIR/bad-let-else-statement.rs:181:5
308+
--> $DIR/bad-let-else-statement.rs:173:5
468309
|
469310
LL | let bad = format_args! {""} else { return; };
470311
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -473,45 +314,16 @@ LL | let bad = format_args! {""} else { return; };
473314
= help: consider removing the `else` clause
474315

475316
warning: irrefutable `let...else` pattern
476-
--> $DIR/bad-let-else-statement.rs:188:19
477-
|
478-
LL | () => { {} }
479-
| ___________________^
480-
LL | |
481-
LL | |
482-
LL | | }
483-
... |
484-
LL | | (1) => {
485-
LL | | let x = a!() else { return; };
486-
| |____________^
487-
...
488-
LL | b!(1); b!(2);
489-
| ----- in this macro invocation
490-
|
491-
= note: this pattern will always match, so the `else` clause is useless
492-
= help: consider removing the `else` clause
493-
= note: this warning originates in the macro `b` (in Nightly builds, run with -Z macro-backtrace for more info)
494-
495-
warning: irrefutable `let...else` pattern
496-
--> $DIR/bad-let-else-statement.rs:188:19
317+
--> $DIR/bad-let-else-statement.rs:204:5
497318
|
498-
LL | () => { {} }
499-
| ___________________^
500-
LL | |
319+
LL | / let foo = &std::ptr::null as &'static dyn std::ops::Fn() -> *const primitive! {
501320
LL | |
502-
LL | | }
503-
... |
504-
LL | | (2) => {
505-
LL | | let x = a! {} else { return; };
506-
| |____________^
507-
...
508-
LL | b!(1); b!(2);
509-
| ----- in this macro invocation
321+
LL | | 8
322+
LL | | } else {
323+
| |_____^
510324
|
511325
= note: this pattern will always match, so the `else` clause is useless
512326
= help: consider removing the `else` clause
513-
= note: this warning originates in the macro `b` (in Nightly builds, run with -Z macro-backtrace for more info)
514327

515-
error: aborting due to 20 previous errors; 18 warnings emitted
328+
error: aborting due to 20 previous errors; 5 warnings emitted
516329

517-
For more information about this error, try `rustc --explain E0384`.

0 commit comments

Comments
 (0)
This repository has been archived.