What version of Go, VS Code & VS Code Go extension are you using?

Version Information
* Run `go version` to get version of Go from _the VS Code integrated terminal_. - go version go1.22.2 linux/amd64 * Run `gopls -v version` to get version of Gopls from _the VS Code integrated terminal_. - golang.org/x/tools/gopls v0.15.3 golang.org/x/tools/gopls@v0.15.3 h1:zbdOidFrPTc8Bx0YrN5QKgJ0zCjyGi0L27sKQ/bDG5o= github.com/BurntSushi/toml@v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= github.com/google/go-cmp@v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= golang.org/x/exp/typeparams@v0.0.0-20221212164502-fae10dda9338 h1:2O2DON6y3XMJiQRAS1UWU+54aec2uopH3x7MAiqGW6Y= golang.org/x/mod@v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= golang.org/x/sync@v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/telemetry@v0.0.0-20240209200032-7b892fcb8a78 h1:vcVnuftN4J4UKLRcgetjzfU9FjjgXUUYUc3JhFplgV4= golang.org/x/text@v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/tools@v0.18.1-0.20240412183611-d92ae0781217 h1:uH9jJYgeLCvblH0S+03kFO0qUDxRkbLRLFiKVVDl7ak= golang.org/x/vuln@v1.0.1 h1:KUas02EjQK5LTuIx1OylBQdKKZ9jeugs+HiqO5HormU= honnef.co/go/tools@v0.4.6 h1:oFEHCKeID7to/3autwsWfnuv69j3NsfcXbvJKuIcep8= mvdan.cc/gofumpt@v0.6.0 h1:G3QvahNDmpD+Aek/bNOLrFR2XC6ZAdo62dZu65gmwGo= mvdan.cc/xurls/v2@v2.5.0 h1:lyBNOm8Wo71UknhUs4QTFUNNMyxy2JEIaKKo0RWOh+8= go: go1.22.2 * Run `code -v` or `code-insiders -v` to get version of VS Code or VS Code Insiders. - 1.88.1 * Check your installed extensions to get the version of the VS Code Go extension - v0.41.2 * Run Ctrl+Shift+P (Cmd+Shift+P on Mac OS) > `Go: Locate Configured Go Tools` command. ## Environment GOBIN: undefined toolsGopath: gopath: /root/go GOROOT: /usr/local/go PATH: /root/.vscode-server/bin/e170252f762678dec6ca2cc69aba1570769a5d39/bin/remote-cli:/usr/local/go/bin:/root/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/.local/bin:/root/.local/bin ## Tools go: /usr/local/go/bin/go: go version go1.22.2 linux/amd64 gopls: /root/go/bin/gopls (version: v0.15.3 built with go: go1.22.2) gotests: /root/go/bin/gotests (version: v1.6.0 built with go: go1.22.2) gomodifytags: /root/go/bin/gomodifytags (version: v1.16.0 built with go: go1.22.2) impl: /root/go/bin/impl (version: v1.1.0 built with go: go1.22.2) goplay: /root/go/bin/goplay (version: v1.0.0 built with go: go1.22.2) dlv: /root/go/bin/dlv (version: v1.22.1 built with go: go1.22.2) staticcheck: /root/go/bin/staticcheck (version: v0.4.7 built with go: go1.22.2) ## Go env Workspace Folder (server): GO111MODULE='' GOARCH='amd64' GOBIN='' GOCACHE='/root/.cache/go-build' GOENV='/root/.config/go/env' GOEXE='' GOEXPERIMENT='' GOFLAGS='' GOHOSTARCH='amd64' GOHOSTOS='linux' GOINSECURE='' GOMODCACHE='/root/go/pkg/mod' GONOPROXY='' GONOSUMDB='' GOOS='linux' GOPATH='/root/go' GOPRIVATE='' GOPROXY='https://proxy.golang.org,direct' GOROOT='/usr/local/go' GOSUMDB='sum.golang.org' GOTMPDIR='' GOTOOLCHAIN='auto' GOTOOLDIR='/usr/local/go/pkg/tool/linux_amd64' GOVCS='' GOVERSION='go1.22.2' GCCGO='gccgo' GOAMD64='v1' AR='ar' CC='gcc' CXX='g++' CGO_ENABLED='1' GOMOD='/xxx/go.mod' GOWORK='' CGO_CFLAGS='-O2 -g' CGO_CPPFLAGS='' CGO_CXXFLAGS='-O2 -g' CGO_FFLAGS='-O2 -g' CGO_LDFLAGS='-O2 -g' PKG_CONFIG='pkg-config' GOGCCFLAGS='-fPIC -m64 -pthread -Wl,--no-gc-sections -fmessage-length=0 -ffile-prefix-map=/tmp/go-build445704314=/tmp/go-build -gno-record-gcc-switches' Workspace Folder (web): GO111MODULE='' GOARCH='amd64' GOBIN='' GOCACHE='/root/.cache/go-build' GOENV='/root/.config/go/env' GOEXE='' GOEXPERIMENT='' GOFLAGS='' GOHOSTARCH='amd64' GOHOSTOS='linux' GOINSECURE='' GOMODCACHE='/root/go/pkg/mod' GONOPROXY='' GONOSUMDB='' GOOS='linux' GOPATH='/root/go' GOPRIVATE='' GOPROXY='https://proxy.golang.org,direct' GOROOT='/usr/local/go' GOSUMDB='sum.golang.org' GOTMPDIR='' GOTOOLCHAIN='auto' GOTOOLDIR='/usr/local/go/pkg/tool/linux_amd64' GOVCS='' GOVERSION='go1.22.2' GCCGO='gccgo' GOAMD64='v1' AR='ar' CC='gcc' CXX='g++' CGO_ENABLED='1' GOMOD='/xxx/go.mod' GOWORK='' CGO_CFLAGS='-O2 -g' CGO_CPPFLAGS='' CGO_CXXFLAGS='-O2 -g' CGO_FFLAGS='-O2 -g' CGO_LDFLAGS='-O2 -g' PKG_CONFIG='pkg-config' GOGCCFLAGS='-fPIC -m64 -pthread -Wl,--no-gc-sections -fmessage-length=0 -ffile-prefix-map=/tmp/go-build300344583=/tmp/go-build -gno-record-gcc-switches'

Describe the bug

go 1.22 alredy fix the loop vairable issue, why waring "loop variable v captured by func literal loopclosure" (go.mod go version 1.22.2)

waring link https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/loopclosure

Steps to reproduce the behavior:

package main

import "fmt"

func main() {
    elem := make([]string, 10)
    for _, v := range elem {
        go func() {
            fmt.Println(v)
        }()
    }
}

Screenshots or recordings

Golang x/tools/gopls: go1.22.2 warning loop variable v captured by func literal loopclosure

Comment From: ansaba

I tried on go1.22.2 darwin/amd64 and the issue was not reproducible.

Comment From: timothy-king

Looks like the GoVersion is < 1.22.0 for the file. This value is derived from the go.mod file for the module, the build tags for the file, and the compiler version used to build gopls (and the -lang flag in some rare cases). The compiler version used to build gopls is >= 1.22 so that is not the issue.

What does the "go 1.XY" line say in the go.mod file? (Or is there no go.mod file?)

Comment From: synhi

Looks like the GoVersion is < 1.22.0 for the file. This value is derived from the go.mod file for the module, the build tags for the file, and the compiler version used to build gopls (and the -lang flag in some rare cases). The compiler version used to build gopls is >= 1.22 so that is not the issue.

What does the "go 1.XY" line say in the go.mod file? (Or is there no go.mod file?)

go.mod: go 1.22.2

Comment From: synhi

I tried on go1.22.2 darwin/amd64 and the issue was not reproducible.

try this command

go clean -cache -modcache

then Run Ctrl+Shift+P (Cmd+Shift+P on Mac OS) > Go: Install/Update Tools command and select all options

I use vscode remote-ssh extension to connect a linux server

Comment From: ohheydom

I'm seeing the same issue. Looks like a possible regression -> https://github.com/golang/go/issues/65910. gopls 0.15.2 works without issue.

Following the same steps from that issue:

gopls version

Build info
----------
golang.org/x/tools/gopls v0.15.3
    golang.org/x/tools/gopls@v0.15.3 h1:zbdOidFrPTc8Bx0YrN5QKgJ0zCjyGi0L27sKQ/bDG5o=
    github.com/BurntSushi/toml@v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak=
    github.com/google/go-cmp@v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
    golang.org/x/exp/typeparams@v0.0.0-20221212164502-fae10dda9338 h1:2O2DON6y3XMJiQRAS1UWU+54aec2uopH3x7MAiqGW6Y=
    golang.org/x/mod@v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8=
    golang.org/x/sync@v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
    golang.org/x/telemetry@v0.0.0-20240209200032-7b892fcb8a78 h1:vcVnuftN4J4UKLRcgetjzfU9FjjgXUUYUc3JhFplgV4=
    golang.org/x/text@v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
    golang.org/x/tools@v0.18.1-0.20240412183611-d92ae0781217 h1:uH9jJYgeLCvblH0S+03kFO0qUDxRkbLRLFiKVVDl7ak=
    golang.org/x/vuln@v1.0.1 h1:KUas02EjQK5LTuIx1OylBQdKKZ9jeugs+HiqO5HormU=
    honnef.co/go/tools@v0.4.6 h1:oFEHCKeID7to/3autwsWfnuv69j3NsfcXbvJKuIcep8=
    mvdan.cc/gofumpt@v0.6.0 h1:G3QvahNDmpD+Aek/bNOLrFR2XC6ZAdo62dZu65gmwGo=
    mvdan.cc/xurls/v2@v2.5.0 h1:lyBNOm8Wo71UknhUs4QTFUNNMyxy2JEIaKKo0RWOh+8=
go: go1.22.2

go env

GO111MODULE=''
GOARCH='arm64'
GOBIN=''
GOCACHE='/Users/dominic/Library/Caches/go-build'
GOENV='/Users/dominic/Library/Application Support/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFLAGS=''
GOHOSTARCH='arm64'
GOHOSTOS='darwin'
GOINSECURE=''
GOMODCACHE='/Users/dominic/go/pkg/mod'
GONOPROXY='gitlab.morningconsult.com'
GONOSUMDB='gitlab.morningconsult.com'
GOOS='darwin'
GOPATH='/Users/dominic/go'
GOPRIVATE='gitlab.morningconsult.com'
GOPROXY='https://proxy.golang.org,direct'
GOROOT='/usr/local/go'
GOSUMDB='sum.golang.org'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/usr/local/go/pkg/tool/darwin_arm64'
GOVCS=''
GOVERSION='go1.22.2'
GCCGO='gccgo'
AR='ar'
CC='clang'
CXX='clang++'
CGO_ENABLED='1'
GOMOD='/Users/dominic/Projects/loopclosure/go.mod''
GOWORK=''
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
PKG_CONFIG='pkg-config'
GOGCCFLAGS='-fPIC -arch arm64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -ffile-prefix-map=/var/folders/r3/5ch28yq55hv_8fk9bd_7jdnm0000gn/T/go-build1471649584=/tmp/go-build -gno-record-gcc-switches -fno-common'

What did you do?

With the following main.go:

package main

import (
    "fmt"
)

func main() {
    for i := range 10 {
        go func() { fmt.Println(i) }()
    }
}

and go.mod

module example.com/loopclosure

go 1.22.2

I ran

gopls check main.go

What did you see happen?

/Users/dominic/Projects/sandbox/main.go:9:27-28: loop variable i captured by func literal

What did you expect to see?

No error message

Comment From: findleyr

Thanks, yes this is a regression in gopls@v0.15.3, specifically this CL: https://go.dev/cl/576678

That code should be comparing language versions, not toolchain versions :(

Fix incoming. To disable this analysis in the meantime: "analyses": { "loopclosure": false }

Comment From: findleyr

Aha, we didn't catch this because it isn't broken at master. The problem is that gopls-release-branch.0.15 lacks https://go.dev/cl/567635.

Comment From: findleyr

Closing as this has been cherry-picked to the release branch, and we are preparing the v0.15.4 release. The release branch was fixed in https://go.dev/cl/579758 (the issue number was wrong in that CL, which is why it wasn't associated here).

Comment From: 0xBradock

@synhi suggestion worked for me.

I am using nvim:

  1. Updated gopls with :Mason + U
  2. Ran go clean -cache -modcache
  3. Then, go mod tidy
  4. Finally, restarted my nvim lsp :LspRestart

I did everything apart from 2 and it failed. It was only after that command that it solved for me

Hope it helps

Comment From: findleyr

Thanks @0xBradock. For what it's worth, steps (2) and (3) should not be necessary. Simply updating gopls to the latest version and restarting should fix the problem.