go-tools icon indicating copy to clipboard operation
go-tools copied to clipboard

False positive with generic interface and generic type

Open errrov opened this issue 1 year ago • 1 comments

  • The output of 'staticcheck -version' : staticcheck.exe 2024.1.1 (0.5.1)

  • The output of 'go version' go version go1.23.0 windows/amd64

  • Exactly which command you ran staticcheck main.go

  • Output of the command and what's wrong with the output

main.go:31:2: field v is unused (U1000)
main.go:38:28: func (*genericStruct[T]).setValue is unused (U1000)
main.go:42:28: func (*genericStruct[T]).getValue is unused (U1000)
package main

import (
	"fmt"
	"reflect"
)

type valueHandler[T any] interface {
	setValue(T)
	getValue() T
}

type handler[T any] struct {
	valueHandler[T]
}

func (h *handler[T]) setAndGetValue(v T) {
	h.setValue(v)
	va := h.getValue()
	fmt.Println("Value is : ", va)
}

type genericStruct[T any] struct {
	v T
}

func newGenericStruct[T any]() *genericStruct[T] {
	return &genericStruct[T]{}
}

func (g *genericStruct[T]) setValue(v T) {
	fmt.Println("setting value")
	g.v = v
}

func (g *genericStruct[T]) getValue() T {
	fmt.Println("getting value")
	return g.v
}

func main() {
	test := handler[int]{newGenericStruct[int]()}
	test.setAndGetValue(1)
}

So staticcheck shows that functions setValue and getValue are not used. However we can see that messages of "setting value" and "getting value" appear. So they are clearly used. For me it seems like false positive.

errrov avatar Nov 06 '24 15:11 errrov

I came here to submit a similar example. If the thing that staticcheck says is unused really was unused, then the program would still compile if it was removed, but it is not.

package somepkg

type wrapper[A any] interface {
	call(a *A)
}

func Foo[A any, T any](set func(*A, T)) {
	w := wrapper[A](&impl[A, T]{set: set})
	w.call(nil)
}

type impl[A, T any] struct {
	thisIsUsed T
	set        func(*A, T)
}

func (w *impl[A, T]) call(a *A) {
	w.set(nil, w.thisIsUsed)
}

rogpeppe avatar Nov 14 '25 18:11 rogpeppe