// Copyright 2021 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.
package typeparams
import "sync"
// The copylock analyzer runs despite errors. The following invalid type should
// not cause an infinite recursion.
type R struct{ r R }
func TestNoRecursion(r R) {}
// The following recursive type parameter definitions should not cause an
// infinite recursion.
func TestNoTypeParamRecursion[T1 ~[]T2, T2 ~[]T1 | string, T3 ~struct{ F T3 }](t1 T1, t2 T2, t3 T3) {
}
func OkFunc1[Struct ~*struct{ mu sync.Mutex }](s Struct) {
}
func BadFunc1[Struct ~struct{ mu sync.Mutex }](s Struct) { // want `passes lock by value: .*Struct contains ~struct{mu sync.Mutex}`
}
func OkFunc2[MutexPtr *sync.Mutex](m MutexPtr) {
var x *MutexPtr
p := x
var y MutexPtr
p = &y
*p = *x
var mus []MutexPtr
for _, _ = range mus {
}
}
func BadFunc2[Mutex sync.Mutex](m Mutex) { // want `passes lock by value: .*Mutex contains sync.Mutex`
var x *Mutex
p := x
var y Mutex
p = &y
*p = *x // want `assignment copies lock value to \*p: .*Mutex contains sync.Mutex`
var mus []Mutex
for _, _ = range mus {
}
}
func ApproximationError[Mutex interface {
~sync.Mutex
M()
}](m Mutex) { // want `passes lock by value: .*Mutex contains ~sync.Mutex`
}