-- go.mod -- module example.com go 1.18 -- template/template.go -- package template // Test import "sync" func before(s sync.RWMutex) { s.Lock() } func after(s sync.RWMutex) { s.RLock() } -- in/f1/f1.go -- package F1 import "sync" func example(n int) { var x struct { mutex sync.RWMutex } var y struct { sync.RWMutex } type l struct { sync.RWMutex } var z struct { l } var a struct { *l } var b struct{ Lock func() } // Match x.mutex.Lock() // Match y.Lock() // Match indirect z.Lock() // Should be no match however currently matches due to: // https://golang.org/issue/8584 // Will start failing when this is fixed then just change golden to // No match pointer indirect // a.Lock() a.Lock() // No match b.Lock() } -- out/f1/f1.go -- package F1 import "sync" func example(n int) { var x struct { mutex sync.RWMutex } var y struct { sync.RWMutex } type l struct { sync.RWMutex } var z struct { l } var a struct { *l } var b struct{ Lock func() } // Match x.mutex.RLock() // Match y.RLock() // Match indirect z.RLock() // Should be no match however currently matches due to: // https://golang.org/issue/8584 // Will start failing when this is fixed then just change golden to // No match pointer indirect // a.Lock() a.RLock() // No match b.Lock() }