about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/librustc_lint/unused.rs19
-rw-r--r--src/test/ui/lint/must_use-tuple.rs4
-rw-r--r--src/test/ui/lint/must_use-tuple.stderr22
3 files changed, 38 insertions, 7 deletions
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