diff --git a/compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs b/compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs
index 32c603e4897..6bcc2bae98a 100644
--- a/compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs
+++ b/compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs
@@ -1156,18 +1156,17 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
         // ```
         // which includes the replacement of the first two `()` for the correct type, and the
         // removal of the last `()`.
-        let mut idx = -1;
+        let mut prev = -1;
         for (expected_idx, provided_idx) in matched_inputs.iter_enumerated() {
             // We want to point not at the *current* argument expression index, but rather at the
             // index position where it *should have been*, which is *after* the previous one.
-            idx = match provided_idx {
-                Some(provided_idx) => provided_idx.index() as i64 + 1,
-                None => idx + 1,
-            };
-            let idx = ProvidedIdx::from_usize(idx as usize);
-            if let None = provided_idx
-                && let Some((_, arg_span)) = provided_arg_tys.get(idx)
-            {
+            if let Some(provided_idx) = provided_idx {
+                prev = provided_idx.index() as i64;
+                continue;
+            }
+            let idx = ProvidedIdx::from_usize((prev + 1) as usize);
+            if let Some((_, arg_span)) = provided_arg_tys.get(idx) {
+                prev += 1;
                 // There is a type that was *not* found anywhere, so it isn't a move, but a
                 // replacement and we look at what type it should have been. This will allow us
                 // To suggest a multipart suggestion when encountering `foo(1, "")` where the def
diff --git a/tests/ui/argument-suggestions/109831.rs b/tests/ui/argument-suggestions/issue-109831.rs
similarity index 100%
rename from tests/ui/argument-suggestions/109831.rs
rename to tests/ui/argument-suggestions/issue-109831.rs
diff --git a/tests/ui/argument-suggestions/109831.stderr b/tests/ui/argument-suggestions/issue-109831.stderr
similarity index 90%
rename from tests/ui/argument-suggestions/109831.stderr
rename to tests/ui/argument-suggestions/issue-109831.stderr
index 861f6d67baf..7b9a3c9ef2c 100644
--- a/tests/ui/argument-suggestions/109831.stderr
+++ b/tests/ui/argument-suggestions/issue-109831.stderr
@@ -1,5 +1,5 @@
 error[E0412]: cannot find type `C` in this scope
-  --> $DIR/109831.rs:4:24
+  --> $DIR/issue-109831.rs:4:24
    |
 LL | struct A;
    | --------- similarly named struct `A` defined here
@@ -17,7 +17,7 @@ LL | fn f<C>(b1: B, b2: B, a2: C) {}
    |     +++
 
 error[E0425]: cannot find value `C` in this scope
-  --> $DIR/109831.rs:7:16
+  --> $DIR/issue-109831.rs:7:16
    |
 LL | struct A;
    | --------- similarly named unit struct `A` defined here
@@ -26,7 +26,7 @@ LL |     f(A, A, B, C);
    |                ^ help: a unit struct with a similar name exists: `A`
 
 error[E0061]: this function takes 3 arguments but 4 arguments were supplied
-  --> $DIR/109831.rs:7:5
+  --> $DIR/issue-109831.rs:7:5
    |
 LL |     f(A, A, B, C);
    |     ^ -  -     - unexpected argument
@@ -35,7 +35,7 @@ LL |     f(A, A, B, C);
    |       expected `B`, found `A`
    |
 note: function defined here
-  --> $DIR/109831.rs:4:4
+  --> $DIR/issue-109831.rs:4:4
    |
 LL | fn f(b1: B, b2: B, a2: C) {}
    |    ^ -----  -----  -----