From af0e6d7058c2143c086da74da40dee7aefab3a85 Mon Sep 17 00:00:00 2001 From: Vitalii Solodilov Date: Wed, 10 Aug 2022 00:24:53 +0300 Subject: [PATCH] checkers: don't call SizeOf for type parameters (#1237) StdSizes.SizeOf method doesn't support type parameters --- checkers/hugeParam_checker.go | 4 ++++ checkers/rangeValCopy_checker.go | 4 ++++ checkers/testdata/hugeParam/negative_tests_go118.go | 6 ++++++ .../testdata/rangeValCopy/negative_tests_go118.go | 11 +++++++++++ go.mod | 1 + 5 files changed, 26 insertions(+) create mode 100644 checkers/testdata/hugeParam/negative_tests_go118.go create mode 100644 checkers/testdata/rangeValCopy/negative_tests_go118.go diff --git a/checkers/hugeParam_checker.go b/checkers/hugeParam_checker.go index c430431a7..5db4ee79a 100644 --- a/checkers/hugeParam_checker.go +++ b/checkers/hugeParam_checker.go @@ -5,6 +5,7 @@ import ( "github.com/go-critic/go-critic/checkers/internal/astwalk" "github.com/go-critic/go-critic/framework/linter" + "golang.org/x/exp/typeparams" ) func init() { @@ -49,6 +50,9 @@ func (c *hugeParamChecker) checkParams(params []*ast.Field) { for _, p := range params { for _, id := range p.Names { typ := c.ctx.TypeOf(id) + if _, ok := typ.(*typeparams.TypeParam); ok { + continue + } size := c.ctx.SizesInfo.Sizeof(typ) if size >= c.sizeThreshold { c.warn(id, size) diff --git a/checkers/rangeValCopy_checker.go b/checkers/rangeValCopy_checker.go index b34aa5c28..cf31b57cc 100644 --- a/checkers/rangeValCopy_checker.go +++ b/checkers/rangeValCopy_checker.go @@ -5,6 +5,7 @@ import ( "github.com/go-critic/go-critic/checkers/internal/astwalk" "github.com/go-critic/go-critic/framework/linter" + "golang.org/x/exp/typeparams" ) func init() { @@ -65,6 +66,9 @@ func (c *rangeValCopyChecker) VisitStmt(stmt ast.Stmt) { if typ == nil { return } + if _, ok := typ.(*typeparams.TypeParam); ok { + return + } if size := c.ctx.SizesInfo.Sizeof(typ); size >= c.sizeThreshold { c.warn(rng, size) } diff --git a/checkers/testdata/hugeParam/negative_tests_go118.go b/checkers/testdata/hugeParam/negative_tests_go118.go new file mode 100644 index 000000000..bbf391c64 --- /dev/null +++ b/checkers/testdata/hugeParam/negative_tests_go118.go @@ -0,0 +1,6 @@ +//go:build go1.18 +// +build go1.18 + +package checker_test + +func genericFunc[T comparable](x T) {} diff --git a/checkers/testdata/rangeValCopy/negative_tests_go118.go b/checkers/testdata/rangeValCopy/negative_tests_go118.go new file mode 100644 index 000000000..658ed32ed --- /dev/null +++ b/checkers/testdata/rangeValCopy/negative_tests_go118.go @@ -0,0 +1,11 @@ +//go:build go1.18 +// +build go1.18 + +package checker_test + +func genericSlice[T any](original []T, f func(T)) { + for _, v := range original { + // OK: v is a type parameter. + f(v) + } +} diff --git a/go.mod b/go.mod index 39d5ba6d9..116b4e49d 100644 --- a/go.mod +++ b/go.mod @@ -16,6 +16,7 @@ require ( github.com/quasilyte/go-ruleguard v0.3.16-0.20220213074421-6aa060fab41a github.com/quasilyte/go-ruleguard/dsl v0.3.21 github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 + golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171 golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e // indirect golang.org/x/tools v0.1.9-0.20211228192929-ee1ca4ffc4da )