gotools/go/analysis/passes/copylock/testdata/src/a/issue61678.go

package a

import "sync"

// These examples are taken from golang/go#61678, modified so that A and B
// contain a mutex.

type A struct {
	a  A
	mu sync.Mutex
}

type B struct {
	a  A
	b  B
	mu sync.Mutex
}

func okay(x A) {}
func sure()    { var x A; nop(x) }

var fine B

func what(x B)   {}                  // want `passes lock by value`
func bad()       { var x B; nop(x) } // want `copies lock value`
func good()      { nop(B{}) }
func stillgood() { nop(B{b: B{b: B{b: B{}}}}) }
func nope()      { nop(B{}.b) } // want `copies lock value`

func nop(any) {} // only used to get around unused variable errors