Skip to content

Commit b365912

Browse files
committed
Fix needless_return with let-else
1 parent 59cd777 commit b365912

File tree

4 files changed

+48
-45
lines changed

4 files changed

+48
-45
lines changed

clippy_lints/src/returns.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use rustc_middle::hir::map::Map;
1111
use rustc_middle::lint::in_external_macro;
1212
use rustc_middle::ty::subst::GenericArgKind;
1313
use rustc_session::{declare_lint_pass, declare_tool_lint};
14+
use rustc_span::hygiene::DesugaringKind;
1415
use rustc_span::source_map::Span;
1516
use rustc_span::sym;
1617

@@ -199,7 +200,9 @@ fn check_final_expr<'tcx>(
199200
check_block_return(cx, ifblock);
200201
}
201202
if let Some(else_clause) = else_clause_opt {
202-
check_final_expr(cx, else_clause, None, RetReplacement::Empty);
203+
if expr.span.desugaring_kind() != Some(DesugaringKind::LetElse) {
204+
check_final_expr(cx, else_clause, None, RetReplacement::Empty);
205+
}
203206
}
204207
},
205208
// a match expr, check all arms

tests/ui/needless_return.fixed

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
11
// run-rustfix
22
// edition:2018
33

4+
#![feature(let_else)]
45
#![allow(unused)]
5-
#![allow(
6-
clippy::if_same_then_else,
7-
clippy::single_match,
8-
clippy::branches_sharing_code,
9-
clippy::needless_bool
10-
)]
6+
#![allow(clippy::if_same_then_else, clippy::single_match, clippy::needless_bool)]
117
#![warn(clippy::needless_return)]
128

139
macro_rules! the_answer {
@@ -207,4 +203,8 @@ async fn async_test_return_in_macro() {
207203
needed_return!(0);
208204
}
209205

206+
fn let_else() {
207+
let Some(1) = Some(1) else { return };
208+
}
209+
210210
fn main() {}

tests/ui/needless_return.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
11
// run-rustfix
22
// edition:2018
33

4+
#![feature(let_else)]
45
#![allow(unused)]
5-
#![allow(
6-
clippy::if_same_then_else,
7-
clippy::single_match,
8-
clippy::branches_sharing_code,
9-
clippy::needless_bool
10-
)]
6+
#![allow(clippy::if_same_then_else, clippy::single_match, clippy::needless_bool)]
117
#![warn(clippy::needless_return)]
128

139
macro_rules! the_answer {
@@ -207,4 +203,8 @@ async fn async_test_return_in_macro() {
207203
needed_return!(0);
208204
}
209205

206+
fn let_else() {
207+
let Some(1) = Some(1) else { return };
208+
}
209+
210210
fn main() {}

tests/ui/needless_return.stderr

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,193 +1,193 @@
11
error: unneeded `return` statement
2-
--> $DIR/needless_return.rs:24:5
2+
--> $DIR/needless_return.rs:20:5
33
|
44
LL | return true;
55
| ^^^^^^^^^^^^ help: remove `return`: `true`
66
|
77
= note: `-D clippy::needless-return` implied by `-D warnings`
88

99
error: unneeded `return` statement
10-
--> $DIR/needless_return.rs:28:5
10+
--> $DIR/needless_return.rs:24:5
1111
|
1212
LL | return true;
1313
| ^^^^^^^^^^^^ help: remove `return`: `true`
1414

1515
error: unneeded `return` statement
16-
--> $DIR/needless_return.rs:33:9
16+
--> $DIR/needless_return.rs:29:9
1717
|
1818
LL | return true;
1919
| ^^^^^^^^^^^^ help: remove `return`: `true`
2020

2121
error: unneeded `return` statement
22-
--> $DIR/needless_return.rs:35:9
22+
--> $DIR/needless_return.rs:31:9
2323
|
2424
LL | return false;
2525
| ^^^^^^^^^^^^^ help: remove `return`: `false`
2626

2727
error: unneeded `return` statement
28-
--> $DIR/needless_return.rs:41:17
28+
--> $DIR/needless_return.rs:37:17
2929
|
3030
LL | true => return false,
3131
| ^^^^^^^^^^^^ help: remove `return`: `false`
3232

3333
error: unneeded `return` statement
34-
--> $DIR/needless_return.rs:43:13
34+
--> $DIR/needless_return.rs:39:13
3535
|
3636
LL | return true;
3737
| ^^^^^^^^^^^^ help: remove `return`: `true`
3838

3939
error: unneeded `return` statement
40-
--> $DIR/needless_return.rs:50:9
40+
--> $DIR/needless_return.rs:46:9
4141
|
4242
LL | return true;
4343
| ^^^^^^^^^^^^ help: remove `return`: `true`
4444

4545
error: unneeded `return` statement
46-
--> $DIR/needless_return.rs:52:16
46+
--> $DIR/needless_return.rs:48:16
4747
|
4848
LL | let _ = || return true;
4949
| ^^^^^^^^^^^ help: remove `return`: `true`
5050

5151
error: unneeded `return` statement
52-
--> $DIR/needless_return.rs:60:5
52+
--> $DIR/needless_return.rs:56:5
5353
|
5454
LL | return;
5555
| ^^^^^^^ help: remove `return`
5656

5757
error: unneeded `return` statement
58-
--> $DIR/needless_return.rs:65:9
58+
--> $DIR/needless_return.rs:61:9
5959
|
6060
LL | return;
6161
| ^^^^^^^ help: remove `return`
6262

6363
error: unneeded `return` statement
64-
--> $DIR/needless_return.rs:67:9
64+
--> $DIR/needless_return.rs:63:9
6565
|
6666
LL | return;
6767
| ^^^^^^^ help: remove `return`
6868

6969
error: unneeded `return` statement
70-
--> $DIR/needless_return.rs:74:14
70+
--> $DIR/needless_return.rs:70:14
7171
|
7272
LL | _ => return,
7373
| ^^^^^^ help: replace `return` with an empty block: `{}`
7474

7575
error: unneeded `return` statement
76-
--> $DIR/needless_return.rs:89:9
76+
--> $DIR/needless_return.rs:85:9
7777
|
7878
LL | return String::from("test");
7979
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove `return`: `String::from("test")`
8080

8181
error: unneeded `return` statement
82-
--> $DIR/needless_return.rs:91:9
82+
--> $DIR/needless_return.rs:87:9
8383
|
8484
LL | return String::new();
8585
| ^^^^^^^^^^^^^^^^^^^^^ help: remove `return`: `String::new()`
8686

8787
error: unneeded `return` statement
88-
--> $DIR/needless_return.rs:112:32
88+
--> $DIR/needless_return.rs:108:32
8989
|
9090
LL | bar.unwrap_or_else(|_| return)
9191
| ^^^^^^ help: replace `return` with an empty block: `{}`
9292

9393
error: unneeded `return` statement
94-
--> $DIR/needless_return.rs:117:13
94+
--> $DIR/needless_return.rs:113:13
9595
|
9696
LL | return;
9797
| ^^^^^^^ help: remove `return`
9898

9999
error: unneeded `return` statement
100-
--> $DIR/needless_return.rs:119:20
100+
--> $DIR/needless_return.rs:115:20
101101
|
102102
LL | let _ = || return;
103103
| ^^^^^^ help: replace `return` with an empty block: `{}`
104104

105105
error: unneeded `return` statement
106-
--> $DIR/needless_return.rs:125:32
106+
--> $DIR/needless_return.rs:121:32
107107
|
108108
LL | res.unwrap_or_else(|_| return Foo)
109109
| ^^^^^^^^^^ help: remove `return`: `Foo`
110110

111111
error: unneeded `return` statement
112-
--> $DIR/needless_return.rs:134:5
112+
--> $DIR/needless_return.rs:130:5
113113
|
114114
LL | return true;
115115
| ^^^^^^^^^^^^ help: remove `return`: `true`
116116

117117
error: unneeded `return` statement
118-
--> $DIR/needless_return.rs:138:5
118+
--> $DIR/needless_return.rs:134:5
119119
|
120120
LL | return true;
121121
| ^^^^^^^^^^^^ help: remove `return`: `true`
122122

123123
error: unneeded `return` statement
124-
--> $DIR/needless_return.rs:143:9
124+
--> $DIR/needless_return.rs:139:9
125125
|
126126
LL | return true;
127127
| ^^^^^^^^^^^^ help: remove `return`: `true`
128128

129129
error: unneeded `return` statement
130-
--> $DIR/needless_return.rs:145:9
130+
--> $DIR/needless_return.rs:141:9
131131
|
132132
LL | return false;
133133
| ^^^^^^^^^^^^^ help: remove `return`: `false`
134134

135135
error: unneeded `return` statement
136-
--> $DIR/needless_return.rs:151:17
136+
--> $DIR/needless_return.rs:147:17
137137
|
138138
LL | true => return false,
139139
| ^^^^^^^^^^^^ help: remove `return`: `false`
140140

141141
error: unneeded `return` statement
142-
--> $DIR/needless_return.rs:153:13
142+
--> $DIR/needless_return.rs:149:13
143143
|
144144
LL | return true;
145145
| ^^^^^^^^^^^^ help: remove `return`: `true`
146146

147147
error: unneeded `return` statement
148-
--> $DIR/needless_return.rs:160:9
148+
--> $DIR/needless_return.rs:156:9
149149
|
150150
LL | return true;
151151
| ^^^^^^^^^^^^ help: remove `return`: `true`
152152

153153
error: unneeded `return` statement
154-
--> $DIR/needless_return.rs:162:16
154+
--> $DIR/needless_return.rs:158:16
155155
|
156156
LL | let _ = || return true;
157157
| ^^^^^^^^^^^ help: remove `return`: `true`
158158

159159
error: unneeded `return` statement
160-
--> $DIR/needless_return.rs:170:5
160+
--> $DIR/needless_return.rs:166:5
161161
|
162162
LL | return;
163163
| ^^^^^^^ help: remove `return`
164164

165165
error: unneeded `return` statement
166-
--> $DIR/needless_return.rs:175:9
166+
--> $DIR/needless_return.rs:171:9
167167
|
168168
LL | return;
169169
| ^^^^^^^ help: remove `return`
170170

171171
error: unneeded `return` statement
172-
--> $DIR/needless_return.rs:177:9
172+
--> $DIR/needless_return.rs:173:9
173173
|
174174
LL | return;
175175
| ^^^^^^^ help: remove `return`
176176

177177
error: unneeded `return` statement
178-
--> $DIR/needless_return.rs:184:14
178+
--> $DIR/needless_return.rs:180:14
179179
|
180180
LL | _ => return,
181181
| ^^^^^^ help: replace `return` with an empty block: `{}`
182182

183183
error: unneeded `return` statement
184-
--> $DIR/needless_return.rs:199:9
184+
--> $DIR/needless_return.rs:195:9
185185
|
186186
LL | return String::from("test");
187187
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove `return`: `String::from("test")`
188188

189189
error: unneeded `return` statement
190-
--> $DIR/needless_return.rs:201:9
190+
--> $DIR/needless_return.rs:197:9
191191
|
192192
LL | return String::new();
193193
| ^^^^^^^^^^^^^^^^^^^^^ help: remove `return`: `String::new()`

0 commit comments

Comments
 (0)