golang/go

x/tools/gopls: code action declare missing method does not infer return type from append or map key

Open

#75,614 opened on Sep 25, 2025

View on GitHub
 (3 comments) (0 reactions) (0 assignees)Go (19,008 forks)batch import
Toolsgoplshelp wanted

Repository metrics

Stars
 (133,883 stars)
PR merge metrics
 (No merged PRs in 30d)

Description

Go version

go version go1.25.1 linux/amd64

Output of go env in your module/workspace:

AR='ar'
CC='x86_64-linux-gnu-gcc'
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_ENABLED='1'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
CXX='x86_64-linux-gnu-g++'
GCCGO='gccgo'
GO111MODULE=''
GOAMD64='v1'
GOARCH='amd64'
GOAUTH='netrc'
GOBIN=''
GOCACHE='/home/pasko/.cache/go-build'
GOCACHEPROG=''
GODEBUG=''
GOENV='/home/pasko/.config/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFIPS140='off'
GOFLAGS=''
GOGCCFLAGS='-fPIC -m64 -pthread -Wl,--no-gc-sections -fmessage-length=0 -ffile-prefix-map=/tmp/go-build2269890805=/tmp/go-build -gno-record-gcc-switches'
GOHOSTARCH='amd64'
GOHOSTOS='linux'
GOINSECURE=''
GOMOD='/home/pasko/stuff/go/test/go.mod'
GOMODCACHE='/home/pasko/.local/share/go/pkg/mod'
GONOPROXY=''
GONOSUMDB=''
GOOS='linux'
GOPATH='/home/pasko/.local/share/go'
GOPRIVATE=''
GOPROXY='https://proxy.golang.org,direct'
GOROOT='/usr/lib/go-1.25'
GOSUMDB='sum.golang.org'
GOTELEMETRY='local'
GOTELEMETRYDIR='/home/pasko/.config/go/telemetry'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/usr/lib/go-1.25/pkg/tool/linux_amd64'
GOVCS=''
GOVERSION='go1.25.1'
GOWORK=''
PKG_CONFIG='pkg-config'

What did you do?

If we have the following code:

package main

type Foo struct{}

func main() {
	var i int
	var f Foo
	var d []int
	var m map[int]int

	i = f.GetInt()
	d = append(d, f.GetInt())
	m[f.GetInt()] = i
}

We get code actions for:

  • i = f.GetInt()
  • d = append(d, f.GetInt())
  • m[f.GetInt()] = i

In all three cases, it can be inferred from context that f.GetInt() should return an int.

When we run code action "Declare missing method Foo.GetInt()" for i = f.GetInt(), we get the following function, correctly returning int:

func (f Foo) GetInt() int {
	panic("unimplemented")
}

What did you see happen?

When we run code action "Declare missing method Foo.GetInt()" for d = append(d, f.GetInt()) or m[f.GetInt()] = i, we get the following function, with no return parameters, which is incompatible with the context where it was used:

func (f Foo) GetInt() {
	panic("unimplemented")
}

What did you expect to see?

A function declaration correctly returning an int:

func (f Foo) GetInt() int {
	panic("unimplemented")
}

Contributor guide