Skip to content

Commit 3dcf399

Browse files
authored
fix(manual_let_else): expressions ending with '}' (#15919)
`let-else` statements do not allow the init expression to end with '}' Fixes #15914 changelog: [`manual_let_else`]: If the init expression ends with `'}'` wrap it with `(...)`
2 parents f975caa + 0702934 commit 3dcf399

File tree

3 files changed

+69
-2
lines changed

3 files changed

+69
-2
lines changed

clippy_lints/src/manual_let_else.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,13 @@ fn emit_manual_let_else(
183183
format!("{{ {sn_else} }}")
184184
};
185185
let sn_bl = replace_in_pattern(cx, span, ident_map, pat, &mut app, true);
186-
let sugg = format!("let {sn_bl} = {sn_expr} else {else_bl};");
186+
let sugg = if sn_expr.ends_with('}') {
187+
// let-else statement expressions are not allowed to end with `}`
188+
// https://rust-lang.github.io/rfcs/3137-let-else.html#let-pattern--if--else--else-
189+
format!("let {sn_bl} = ({sn_expr}) else {else_bl};")
190+
} else {
191+
format!("let {sn_bl} = {sn_expr} else {else_bl};")
192+
};
187193
diag.span_suggestion(span, "consider writing", sugg, app);
188194
},
189195
);

tests/ui/manual_let_else.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -546,3 +546,28 @@ mod issue14598 {
546546
todo!()
547547
}
548548
}
549+
550+
mod issue15914 {
551+
// https://github.com/rust-lang/rust-clippy/issues/15914
552+
unsafe fn something_unsafe() -> Option<u32> {
553+
None
554+
}
555+
556+
fn foo() {
557+
let value = if let Some(value) = unsafe { something_unsafe() } {
558+
//~^ manual_let_else
559+
value
560+
} else {
561+
return;
562+
};
563+
564+
let some_flag = true;
565+
566+
let value = if let Some(value) = if some_flag { None } else { Some(3) } {
567+
//~^ manual_let_else
568+
value
569+
} else {
570+
return;
571+
};
572+
}
573+
}

tests/ui/manual_let_else.stderr

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,5 +549,41 @@ LL | | Some(x) => x,
549549
LL | | };
550550
| |__________^ help: consider writing: `let Some(v) = w else { return Err("abc") };`
551551

552-
error: aborting due to 35 previous errors
552+
error: this could be rewritten as `let...else`
553+
--> tests/ui/manual_let_else.rs:557:9
554+
|
555+
LL | / let value = if let Some(value) = unsafe { something_unsafe() } {
556+
LL | |
557+
LL | | value
558+
LL | | } else {
559+
LL | | return;
560+
LL | | };
561+
| |__________^
562+
|
563+
help: consider writing
564+
|
565+
LL ~ let Some(value) = (unsafe { something_unsafe() }) else {
566+
LL + return;
567+
LL + };
568+
|
569+
570+
error: this could be rewritten as `let...else`
571+
--> tests/ui/manual_let_else.rs:566:9
572+
|
573+
LL | / let value = if let Some(value) = if some_flag { None } else { Some(3) } {
574+
LL | |
575+
LL | | value
576+
LL | | } else {
577+
LL | | return;
578+
LL | | };
579+
| |__________^
580+
|
581+
help: consider writing
582+
|
583+
LL ~ let Some(value) = (if some_flag { None } else { Some(3) }) else {
584+
LL + return;
585+
LL + };
586+
|
587+
588+
error: aborting due to 37 previous errors
553589

0 commit comments

Comments
 (0)