From 2e5924438382f74114837e373227dd578de6054c Mon Sep 17 00:00:00 2001 From: Nathan Baulch Date: Tue, 3 Feb 2026 21:57:50 +1100 Subject: [PATCH] Exclude if ellipsis append references a loop var --- pkg/prealloc.go | 7 +++++-- testdata/append.go | 15 ++++++++++----- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/pkg/prealloc.go b/pkg/prealloc.go index aaedab1..58448e6 100644 --- a/pkg/prealloc.go +++ b/pkg/prealloc.go @@ -229,9 +229,12 @@ func (v *returnsVisitor) Visit(node ast.Node) ast.Visitor { return v } - if sliceDecl.hasReturn || sliceDecl.level != v.level || sliceDecl.detached { + switch { + case sliceDecl.hasReturn || sliceDecl.level != v.level || sliceDecl.detached: sliceDecl.exclude = true - } else { + case s.Ellipsis.IsValid() && hasAny(s, v.loopVars): + sliceDecl.exclude = true + default: if sliceDecl.assigning { sliceDecl.assigning = false } else { diff --git a/testdata/append.go b/testdata/append.go index 77ced2b..6920a50 100644 --- a/testdata/append.go +++ b/testdata/append.go @@ -86,6 +86,14 @@ func appendEllipsisTypeConvert() { } } +func appendEllipsisUsesLoopVar() { + var x []byte + var y []string + for i := range 5 { + x = append(x, y[i]...) + } +} + func appendMultipleCallsRange() { var x []int // want "Consider preallocating x with capacity 10$" for i := range 5 { @@ -126,11 +134,8 @@ func appendMultipleRangeStringVar() { } func appendAppend() { - s := "Hello" - var x []int // want "Consider preallocating x with capacity 2 \\* len\\(s\\)$" - for i := range s { - x = append(x, append([]int{i}, i)...) - } + var x []int // want "Consider preallocating x with capacity 4$" + x = append(x, append([]int{1, 2}, 3, 4)...) } func appendDetached() {