diff --git a/go/analysis/passes/copylock/copylock.go b/go/analysis/passes/copylock/copylock.go index d0c4df091ed..8f6e7db6a27 100644 --- a/go/analysis/passes/copylock/copylock.go +++ b/go/analysis/passes/copylock/copylock.go @@ -240,7 +240,10 @@ func lockPathRhs(pass *analysis.Pass, x ast.Expr) typePath { return nil } } - return lockPath(pass.Pkg, pass.TypesInfo.Types[x].Type, nil) + if tv, ok := pass.TypesInfo.Types[x]; ok && tv.IsValue() { + return lockPath(pass.Pkg, tv.Type, nil) + } + return nil } // lockPath returns a typePath describing the location of a lock value diff --git a/go/analysis/passes/copylock/copylock_test.go b/go/analysis/passes/copylock/copylock_test.go index 5726806dbf9..91bef71979b 100644 --- a/go/analysis/passes/copylock/copylock_test.go +++ b/go/analysis/passes/copylock/copylock_test.go @@ -13,5 +13,5 @@ import ( func Test(t *testing.T) { testdata := analysistest.TestData() - analysistest.Run(t, testdata, copylock.Analyzer, "a", "typeparams") + analysistest.Run(t, testdata, copylock.Analyzer, "a", "typeparams", "issue67787") } diff --git a/go/analysis/passes/copylock/main.go b/go/analysis/passes/copylock/main.go new file mode 100644 index 00000000000..77b614ff4f5 --- /dev/null +++ b/go/analysis/passes/copylock/main.go @@ -0,0 +1,16 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build ignore + +// The copylock command applies the golang.org/x/tools/go/analysis/passes/copylock +// analysis to the specified packages of Go source code. +package main + +import ( + "golang.org/x/tools/go/analysis/passes/copylock" + "golang.org/x/tools/go/analysis/singlechecker" +) + +func main() { singlechecker.Main(copylock.Analyzer) } diff --git a/go/analysis/passes/copylock/testdata/src/issue67787/issue67787.go b/go/analysis/passes/copylock/testdata/src/issue67787/issue67787.go new file mode 100644 index 00000000000..c71773dff9d --- /dev/null +++ b/go/analysis/passes/copylock/testdata/src/issue67787/issue67787.go @@ -0,0 +1,8 @@ +package issue67787 + +import "sync" + +type T struct{ mu sync.Mutex } +type T1 struct{ t *T } + +func NewT1() *T1 { return &T1{T} } // no analyzer diagnostic about T