Skip to content

Commit e121d96

Browse files
committed
Use precise span for must_use tuple components
1 parent fd36b5f commit e121d96

File tree

3 files changed

+38
-7
lines changed

3 files changed

+38
-7
lines changed

src/librustc_lint/unused.rs

+15-4
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedResults {
5454
{
5555
true
5656
} else {
57-
check_must_use_ty(cx, ty, s.span)
57+
check_must_use_ty(cx, ty, &expr, s.span)
5858
};
5959

6060
let mut fn_warned = false;
@@ -138,6 +138,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedResults {
138138
fn check_must_use_ty(
139139
cx: &LateContext<'_, '_>,
140140
ty: Ty<'_>,
141+
expr: &hir::Expr,
141142
span: Span,
142143
) -> bool {
143144
match ty.sty {
@@ -170,9 +171,19 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedResults {
170171
has_emitted
171172
}
172173
ty::Tuple(ref tys) => {
173-
tys.iter().map(|k| k.expect_ty()).any(|ty| {
174-
check_must_use_ty(cx, ty, span)
175-
})
174+
let mut has_emitted = false;
175+
let spans = if let hir::ExprKind::Tup(comps) = &expr.node {
176+
debug_assert_eq!(comps.len(), tys.len());
177+
comps.iter().map(|e| e.span).collect()
178+
} else {
179+
vec![]
180+
};
181+
for (i, ty) in tys.iter().map(|k| k.expect_ty()).enumerate() {
182+
if check_must_use_ty(cx, ty, expr, *spans.get(i).unwrap_or(&span)) {
183+
has_emitted = true;
184+
}
185+
}
186+
has_emitted
176187
}
177188
_ => false,
178189
}

src/test/ui/lint/must_use-tuple.rs

+4
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,8 @@
22

33
fn main() {
44
(Ok::<(), ()>(()),); //~ ERROR unused `std::result::Result` that must be used
5+
6+
(Ok::<(), ()>(()), 0, Ok::<(), ()>(()), 5);
7+
//~^ ERROR unused `std::result::Result` that must be used
8+
//~^^ ERROR unused `std::result::Result` that must be used
59
}
+19-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
error: unused `std::result::Result` that must be used
2-
--> $DIR/must_use-tuple.rs:4:5
2+
--> $DIR/must_use-tuple.rs:4:6
33
|
44
LL | (Ok::<(), ()>(()),);
5-
| ^^^^^^^^^^^^^^^^^^^^
5+
| ^^^^^^^^^^^^^^^^
66
|
77
note: lint level defined here
88
--> $DIR/must_use-tuple.rs:1:9
@@ -11,5 +11,21 @@ LL | #![deny(unused_must_use)]
1111
| ^^^^^^^^^^^^^^^
1212
= note: this `Result` may be an `Err` variant, which should be handled
1313

14-
error: aborting due to previous error
14+
error: unused `std::result::Result` that must be used
15+
--> $DIR/must_use-tuple.rs:6:6
16+
|
17+
LL | (Ok::<(), ()>(()), 0, Ok::<(), ()>(()), 5);
18+
| ^^^^^^^^^^^^^^^^
19+
|
20+
= note: this `Result` may be an `Err` variant, which should be handled
21+
22+
error: unused `std::result::Result` that must be used
23+
--> $DIR/must_use-tuple.rs:6:27
24+
|
25+
LL | (Ok::<(), ()>(()), 0, Ok::<(), ()>(()), 5);
26+
| ^^^^^^^^^^^^^^^^
27+
|
28+
= note: this `Result` may be an `Err` variant, which should be handled
29+
30+
error: aborting due to 3 previous errors
1531

0 commit comments

Comments
 (0)