diff --git a/pkg/golinters/govet.go b/pkg/golinters/govet.go index 7ea1f094e641..4e79c980b8ff 100644 --- a/pkg/golinters/govet.go +++ b/pkg/golinters/govet.go @@ -17,6 +17,7 @@ import ( "golang.org/x/tools/go/analysis/passes/errorsas" "golang.org/x/tools/go/analysis/passes/findcall" "golang.org/x/tools/go/analysis/passes/httpresponse" + "golang.org/x/tools/go/analysis/passes/ifaceassert" _ "golang.org/x/tools/go/analysis/passes/inspect" // unused internal analyzer "golang.org/x/tools/go/analysis/passes/loopclosure" "golang.org/x/tools/go/analysis/passes/lostcancel" @@ -28,6 +29,7 @@ import ( "golang.org/x/tools/go/analysis/passes/shift" "golang.org/x/tools/go/analysis/passes/sortslice" "golang.org/x/tools/go/analysis/passes/stdmethods" + "golang.org/x/tools/go/analysis/passes/stringintconv" "golang.org/x/tools/go/analysis/passes/structtag" "golang.org/x/tools/go/analysis/passes/testinggoroutine" "golang.org/x/tools/go/analysis/passes/tests" @@ -55,6 +57,7 @@ var ( errorsas.Analyzer, findcall.Analyzer, httpresponse.Analyzer, + ifaceassert.Analyzer, loopclosure.Analyzer, lostcancel.Analyzer, nilfunc.Analyzer, @@ -64,6 +67,7 @@ var ( shift.Analyzer, sortslice.Analyzer, stdmethods.Analyzer, + stringintconv.Analyzer, structtag.Analyzer, testinggoroutine.Analyzer, tests.Analyzer, @@ -90,6 +94,7 @@ var ( printf.Analyzer, shift.Analyzer, stdmethods.Analyzer, + stringintconv.Analyzer, structtag.Analyzer, tests.Analyzer, unmarshal.Analyzer, diff --git a/test/testdata/govet.go b/test/testdata/govet.go index 2843521e46d9..b97980352046 100644 --- a/test/testdata/govet.go +++ b/test/testdata/govet.go @@ -8,7 +8,7 @@ import ( "os" ) -func Govet() error { +func GovetComposites() error { return &os.PathError{"first", "path", os.ErrNotExist} // ERROR "composites: \\`(os|io/fs)\\.PathError\\` composite literal uses unkeyed fields" } @@ -36,3 +36,8 @@ func GovetPrintf() { x := "dummy" fmt.Printf("%d", x) // ERROR "printf: Printf format %d has arg x of wrong type string" } + +func GovetStringIntConv() { + i := 42 + fmt.Println("i = " + string(i)) // ERROR "stringintconv: conversion from int to string yields a string of one rune, not a string of digits \\(did you mean fmt.Sprint\\(x\\)\\?\\)" +} diff --git a/test/testdata/govet_ifaceassert.go b/test/testdata/govet_ifaceassert.go new file mode 100644 index 000000000000..9a4253aa0465 --- /dev/null +++ b/test/testdata/govet_ifaceassert.go @@ -0,0 +1,14 @@ +//args: -Egovet +//config: linters-settings.govet.enable=ifaceassert +package testdata + +import ( + "io" +) + +func GovetIfaceAssert() { + var v interface { + Read() + } + _ = v.(io.Reader) // ERROR "impossible type assertion: no type can implement both interface\\{Read\\(\\)\\} and io\\.Reader \\(conflicting types for Read method\\)" +}