diff --git a/src/librustc_lint/unused.rs b/src/librustc_lint/unused.rs index 67ea41e1bed..a2bf0b894f6 100644 --- a/src/librustc_lint/unused.rs +++ b/src/librustc_lint/unused.rs @@ -54,7 +54,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedResults { { true } else { - check_must_use_ty(cx, ty, s.span) + check_must_use_ty(cx, ty, &expr, s.span) }; let mut fn_warned = false; @@ -138,6 +138,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedResults { fn check_must_use_ty( cx: &LateContext<'_, '_>, ty: Ty<'_>, + expr: &hir::Expr, span: Span, ) -> bool { match ty.sty { @@ -170,9 +171,19 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedResults { has_emitted } ty::Tuple(ref tys) => { - tys.iter().map(|k| k.expect_ty()).any(|ty| { - check_must_use_ty(cx, ty, span) - }) + let mut has_emitted = false; + let spans = if let hir::ExprKind::Tup(comps) = &expr.node { + debug_assert_eq!(comps.len(), tys.len()); + comps.iter().map(|e| e.span).collect() + } else { + vec![] + }; + for (i, ty) in tys.iter().map(|k| k.expect_ty()).enumerate() { + if check_must_use_ty(cx, ty, expr, *spans.get(i).unwrap_or(&span)) { + has_emitted = true; + } + } + has_emitted } _ => false, } diff --git a/src/test/ui/lint/must_use-tuple.rs b/src/test/ui/lint/must_use-tuple.rs index bc972d7ffc3..2cdcfef35f7 100644 --- a/src/test/ui/lint/must_use-tuple.rs +++ b/src/test/ui/lint/must_use-tuple.rs @@ -2,4 +2,8 @@ fn main() { (Ok::<(), ()>(()),); //~ ERROR unused `std::result::Result` that must be used + + (Ok::<(), ()>(()), 0, Ok::<(), ()>(()), 5); + //~^ ERROR unused `std::result::Result` that must be used + //~^^ ERROR unused `std::result::Result` that must be used } diff --git a/src/test/ui/lint/must_use-tuple.stderr b/src/test/ui/lint/must_use-tuple.stderr index 67d1ec01966..59cdf5849f7 100644 --- a/src/test/ui/lint/must_use-tuple.stderr +++ b/src/test/ui/lint/must_use-tuple.stderr @@ -1,8 +1,8 @@ error: unused `std::result::Result` that must be used - --> $DIR/must_use-tuple.rs:4:5 + --> $DIR/must_use-tuple.rs:4:6 | LL | (Ok::<(), ()>(()),); - | ^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^ | note: lint level defined here --> $DIR/must_use-tuple.rs:1:9 @@ -11,5 +11,21 @@ LL | #![deny(unused_must_use)] | ^^^^^^^^^^^^^^^ = note: this `Result` may be an `Err` variant, which should be handled -error: aborting due to previous error +error: unused `std::result::Result` that must be used + --> $DIR/must_use-tuple.rs:6:6 + | +LL | (Ok::<(), ()>(()), 0, Ok::<(), ()>(()), 5); + | ^^^^^^^^^^^^^^^^ + | + = note: this `Result` may be an `Err` variant, which should be handled + +error: unused `std::result::Result` that must be used + --> $DIR/must_use-tuple.rs:6:27 + | +LL | (Ok::<(), ()>(()), 0, Ok::<(), ()>(()), 5); + | ^^^^^^^^^^^^^^^^ + | + = note: this `Result` may be an `Err` variant, which should be handled + +error: aborting due to 3 previous errors