package pkg func fn(x int) { var z int var y int x = x // want `self-assignment` y = y // want `self-assignment` y, x, z = y, x, 1 // want `self-assignment of y to y` `self-assignment of x to x` y = x _ = y _ = x _ = z func() { x := x println(x) }() } func fn1() { var ( x []byte ch chan int ) x[42] = x[42] // want `self-assignment` x[pure(42)] = x[pure(42)] // want `self-assignment` x[pure(pure(42))] = x[pure(pure(42))] // want `self-assignment` x[impure(42)] = x[impure(42)] x[impure(pure(42))] = x[impure(pure(42))] x[pure(impure(42))] = x[pure(impure(42))] x[pure(<-ch)] = x[pure(<-ch)] x[pure(pure(<-ch))] = x[pure(pure(<-ch))] x[<-ch] = x[<-ch] type T struct { x []int } var ts []T ts[impure(42)].x = ts[impure(42)].x m := map[*int]int{} m[ptr1()] = m[ptr1()] m[ptr2()] = m[ptr2()] m[new(int)] = m[new(int)] m2 := map[int]int{} m2[len(x)] = m2[len(x)] // want `self-assignment` gen1()[0] = gen1()[0] gen2(0)[0] = gen2(0)[0] // want `self-assignment` gen3(0)[0] = gen3(0)[0] } func ptr1() *int { return new(int) } func ptr2() *int { x := 0 return &x } func gen1() []int { return nil } func gen2(x int) []int { return nil } func gen3(x int) []int { return make([]int, 0) } func pure(n int) int { return n } func impure(n int) int { println(n) return n }