Skip to content

Commit c8eba8e

Browse files
committed
Auto merge of #9967 - koka831:fix/9416, r=llogiq
Remove blank lines when needless_return returns no value fix #9416 changelog: [`needless_return`] improve result format r? `@llogiq`
2 parents ef84397 + 39d0477 commit c8eba8e

File tree

4 files changed

+106
-40
lines changed

4 files changed

+106
-40
lines changed

clippy_lints/src/returns.rs

+22-7
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use rustc_middle::lint::in_external_macro;
1212
use rustc_middle::ty::subst::GenericArgKind;
1313
use rustc_session::{declare_lint_pass, declare_tool_lint};
1414
use rustc_span::source_map::Span;
15+
use rustc_span::{BytePos, Pos};
1516

1617
declare_clippy_lint! {
1718
/// ### What it does
@@ -209,13 +210,14 @@ fn check_final_expr<'tcx>(
209210
if cx.tcx.hir().attrs(expr.hir_id).is_empty() {
210211
let borrows = inner.map_or(false, |inner| last_statement_borrows(cx, inner));
211212
if !borrows {
212-
emit_return_lint(
213-
cx,
214-
peeled_drop_expr.span,
215-
semi_spans,
216-
inner.as_ref().map(|i| i.span),
217-
replacement,
218-
);
213+
// check if expr return nothing
214+
let ret_span = if inner.is_none() && replacement == RetReplacement::Empty {
215+
extend_span_to_previous_non_ws(cx, peeled_drop_expr.span)
216+
} else {
217+
peeled_drop_expr.span
218+
};
219+
220+
emit_return_lint(cx, ret_span, semi_spans, inner.as_ref().map(|i| i.span), replacement);
219221
}
220222
}
221223
},
@@ -289,3 +291,16 @@ fn last_statement_borrows<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'tcx>)
289291
})
290292
.is_some()
291293
}
294+
295+
// Go backwards while encountering whitespace and extend the given Span to that point.
296+
fn extend_span_to_previous_non_ws(cx: &LateContext<'_>, sp: Span) -> Span {
297+
if let Ok(prev_source) = cx.sess().source_map().span_to_prev_source(sp) {
298+
let ws = [' ', '\t', '\n'];
299+
if let Some(non_ws_pos) = prev_source.rfind(|c| !ws.contains(&c)) {
300+
let len = prev_source.len() - non_ws_pos - 1;
301+
return sp.with_lo(sp.lo() - BytePos::from_usize(len));
302+
}
303+
}
304+
305+
sp
306+
}

tests/ui/needless_return.fixed

+11-8
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,11 @@ fn test_macro_call() -> i32 {
5959
}
6060

6161
fn test_void_fun() {
62-
6362
}
6463

6564
fn test_void_if_fun(b: bool) {
6665
if b {
67-
6866
} else {
69-
7067
}
7168
}
7269

@@ -82,7 +79,6 @@ fn test_nested_match(x: u32) {
8279
0 => (),
8380
1 => {
8481
let _ = 42;
85-
8682
},
8783
_ => (),
8884
}
@@ -126,7 +122,6 @@ mod issue6501 {
126122

127123
fn test_closure() {
128124
let _ = || {
129-
130125
};
131126
let _ = || {};
132127
}
@@ -179,14 +174,11 @@ async fn async_test_macro_call() -> i32 {
179174
}
180175

181176
async fn async_test_void_fun() {
182-
183177
}
184178

185179
async fn async_test_void_if_fun(b: bool) {
186180
if b {
187-
188181
} else {
189-
190182
}
191183
}
192184

@@ -269,4 +261,15 @@ fn issue9503(x: usize) -> isize {
269261
}
270262
}
271263

264+
mod issue9416 {
265+
pub fn with_newline() {
266+
let _ = 42;
267+
}
268+
269+
#[rustfmt::skip]
270+
pub fn oneline() {
271+
let _ = 42;
272+
}
273+
}
274+
272275
fn main() {}

tests/ui/needless_return.rs

+13
Original file line numberDiff line numberDiff line change
@@ -269,4 +269,17 @@ fn issue9503(x: usize) -> isize {
269269
};
270270
}
271271

272+
mod issue9416 {
273+
pub fn with_newline() {
274+
let _ = 42;
275+
276+
return;
277+
}
278+
279+
#[rustfmt::skip]
280+
pub fn oneline() {
281+
let _ = 42; return;
282+
}
283+
}
284+
272285
fn main() {}

tests/ui/needless_return.stderr

+60-25
Original file line numberDiff line numberDiff line change
@@ -72,26 +72,32 @@ LL | return the_answer!();
7272
= help: remove `return`
7373

7474
error: unneeded `return` statement
75-
--> $DIR/needless_return.rs:62:5
75+
--> $DIR/needless_return.rs:61:21
7676
|
77-
LL | return;
78-
| ^^^^^^
77+
LL | fn test_void_fun() {
78+
| _____________________^
79+
LL | | return;
80+
| |__________^
7981
|
8082
= help: remove `return`
8183

8284
error: unneeded `return` statement
83-
--> $DIR/needless_return.rs:67:9
85+
--> $DIR/needless_return.rs:66:11
8486
|
85-
LL | return;
86-
| ^^^^^^
87+
LL | if b {
88+
| ___________^
89+
LL | | return;
90+
| |______________^
8791
|
8892
= help: remove `return`
8993

9094
error: unneeded `return` statement
91-
--> $DIR/needless_return.rs:69:9
95+
--> $DIR/needless_return.rs:68:13
9296
|
93-
LL | return;
94-
| ^^^^^^
97+
LL | } else {
98+
| _____________^
99+
LL | | return;
100+
| |______________^
95101
|
96102
= help: remove `return`
97103

@@ -104,10 +110,12 @@ LL | _ => return,
104110
= help: replace `return` with a unit value
105111

106112
error: unneeded `return` statement
107-
--> $DIR/needless_return.rs:85:13
113+
--> $DIR/needless_return.rs:84:24
108114
|
109-
LL | return;
110-
| ^^^^^^
115+
LL | let _ = 42;
116+
| ________________________^
117+
LL | | return;
118+
| |__________________^
111119
|
112120
= help: remove `return`
113121

@@ -144,10 +152,12 @@ LL | bar.unwrap_or_else(|_| return)
144152
= help: replace `return` with an empty block
145153

146154
error: unneeded `return` statement
147-
--> $DIR/needless_return.rs:129:13
155+
--> $DIR/needless_return.rs:128:21
148156
|
149-
LL | return;
150-
| ^^^^^^
157+
LL | let _ = || {
158+
| _____________________^
159+
LL | | return;
160+
| |__________________^
151161
|
152162
= help: remove `return`
153163

@@ -240,26 +250,32 @@ LL | return the_answer!();
240250
= help: remove `return`
241251

242252
error: unneeded `return` statement
243-
--> $DIR/needless_return.rs:182:5
253+
--> $DIR/needless_return.rs:181:33
244254
|
245-
LL | return;
246-
| ^^^^^^
255+
LL | async fn async_test_void_fun() {
256+
| _________________________________^
257+
LL | | return;
258+
| |__________^
247259
|
248260
= help: remove `return`
249261

250262
error: unneeded `return` statement
251-
--> $DIR/needless_return.rs:187:9
263+
--> $DIR/needless_return.rs:186:11
252264
|
253-
LL | return;
254-
| ^^^^^^
265+
LL | if b {
266+
| ___________^
267+
LL | | return;
268+
| |______________^
255269
|
256270
= help: remove `return`
257271

258272
error: unneeded `return` statement
259-
--> $DIR/needless_return.rs:189:9
273+
--> $DIR/needless_return.rs:188:13
260274
|
261-
LL | return;
262-
| ^^^^^^
275+
LL | } else {
276+
| _____________^
277+
LL | | return;
278+
| |______________^
263279
|
264280
= help: remove `return`
265281

@@ -351,5 +367,24 @@ LL | return !*(x as *const isize);
351367
|
352368
= help: remove `return`
353369

354-
error: aborting due to 44 previous errors
370+
error: unneeded `return` statement
371+
--> $DIR/needless_return.rs:274:20
372+
|
373+
LL | let _ = 42;
374+
| ____________________^
375+
LL | |
376+
LL | | return;
377+
| |______________^
378+
|
379+
= help: remove `return`
380+
381+
error: unneeded `return` statement
382+
--> $DIR/needless_return.rs:281:20
383+
|
384+
LL | let _ = 42; return;
385+
| ^^^^^^^
386+
|
387+
= help: remove `return`
388+
389+
error: aborting due to 46 previous errors
355390

0 commit comments

Comments
 (0)