From 57d93d16f684f45fecec45a6eedb071a7eb65273 Mon Sep 17 00:00:00 2001 From: RoomWithOutRoof Date: Fri, 17 Apr 2026 02:20:58 +0800 Subject: [PATCH] slicesbackward: omit unused value variable in range clause When converting a backward loop to use slices.Backward, the analyzer was incorrectly including the value variable (v) in the generated code even when v was never used in the loop body. For example, when the original loop was: for i := len(s) - 1; i >= 0; i-- { println(i) } The generated code was: for i, v := range slices.Backward(s) { println(i) } This caused a "declared and not used" compile error because v was never referenced. The fix checks if the slice value is actually used before including the value variable in the range clause. If the value is not used, only the index is included: for i := range slices.Backward(s) { println(i) } Fixes golang/go#78629 --- go/analysis/passes/modernize/slicesbackward.go | 8 ++++++-- .../testdata/src/slicesbackward/slicesbackward.go.golden | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/go/analysis/passes/modernize/slicesbackward.go b/go/analysis/passes/modernize/slicesbackward.go index 293a7c0c3fb..660b8bc502f 100644 --- a/go/analysis/passes/modernize/slicesbackward.go +++ b/go/analysis/passes/modernize/slicesbackward.go @@ -189,10 +189,14 @@ func slicesbackward(pass *analysis.Pass) (any, error) { // All uses of i are s[i]; drop the index variable. header = fmt.Sprintf("_, %s := range %sBackward(%s)", elemName, prefix, sliceStr) - } else { - // i is used for other purposes; keep both index and value. + } else if len(sliceIndexes) > 0 { + // i is used for other purposes and the slice value is also used; keep both. header = fmt.Sprintf("%s, %s := range %sBackward(%s)", indexIdent.Name, elemName, prefix, sliceStr) + } else { + // i is used for other purposes but the slice value is not used; drop v. + header = fmt.Sprintf("%s := range %sBackward(%s)", + indexIdent.Name, prefix, sliceStr) } edits = append(edits, analysis.TextEdit{ Pos: loop.Init.Pos(), diff --git a/go/analysis/passes/modernize/testdata/src/slicesbackward/slicesbackward.go.golden b/go/analysis/passes/modernize/testdata/src/slicesbackward/slicesbackward.go.golden index ba099057893..2c7308dcaf7 100644 --- a/go/analysis/passes/modernize/testdata/src/slicesbackward/slicesbackward.go.golden +++ b/go/analysis/passes/modernize/testdata/src/slicesbackward/slicesbackward.go.golden @@ -24,7 +24,7 @@ func indexUsedElsewhere(s []int) { // Index used only for non-slice purpose (no s[i] at all). func indexNoSliceAccess(s []int) { - for i, v := range slices.Backward(s) { // want "backward loop over slice can be modernized using slices.Backward" + for i := range slices.Backward(s) { // want "backward loop over slice can be modernized using slices.Backward" println(i) } }