diff --git a/go/analysis/passes/unmarshal/testdata/src/typeparams/typeparams.go b/go/analysis/passes/unmarshal/testdata/src/typeparams/typeparams.go new file mode 100644 index 0000000000..cbf7deb4ec --- /dev/null +++ b/go/analysis/passes/unmarshal/testdata/src/typeparams/typeparams.go @@ -0,0 +1,22 @@ +package typeparams + +import ( + "encoding/json" + "fmt" +) + +func unmarshalT[T any](data []byte) T { + var x T + json.Unmarshal(data, x) + return x +} + +func unmarshalT2[T any](data []byte, t T) { + json.Unmarshal(data, t) +} + +func main() { + x := make(map[string]interface{}) + unmarshalT2([]byte(`{"a":1}`), &x) + fmt.Println(x) +} \ No newline at end of file diff --git a/go/analysis/passes/unmarshal/unmarshal.go b/go/analysis/passes/unmarshal/unmarshal.go index 92b37caff9..5129048a07 100644 --- a/go/analysis/passes/unmarshal/unmarshal.go +++ b/go/analysis/passes/unmarshal/unmarshal.go @@ -14,6 +14,7 @@ import ( "golang.org/x/tools/go/analysis/passes/inspect" "golang.org/x/tools/go/ast/inspector" "golang.org/x/tools/go/types/typeutil" + "golang.org/x/tools/internal/typeparams" ) const Doc = `report passing non-pointer or non-interface values to unmarshal @@ -85,7 +86,7 @@ func run(pass *analysis.Pass) (interface{}, error) { t := pass.TypesInfo.Types[call.Args[argidx]].Type switch t.Underlying().(type) { - case *types.Pointer, *types.Interface: + case *types.Pointer, *types.Interface, *typeparams.TypeParam: return } diff --git a/go/analysis/passes/unmarshal/unmarshal_test.go b/go/analysis/passes/unmarshal/unmarshal_test.go index ae19e5dd2d..e6171f2f09 100644 --- a/go/analysis/passes/unmarshal/unmarshal_test.go +++ b/go/analysis/passes/unmarshal/unmarshal_test.go @@ -9,9 +9,14 @@ import ( "golang.org/x/tools/go/analysis/analysistest" "golang.org/x/tools/go/analysis/passes/unmarshal" + "golang.org/x/tools/internal/typeparams" ) func Test(t *testing.T) { testdata := analysistest.TestData() - analysistest.Run(t, testdata, unmarshal.Analyzer, "a") + tests := []string{"a"} + if typeparams.Enabled { + tests = append(tests, "typeparams") + } + analysistest.Run(t, testdata, unmarshal.Analyzer, tests...) }