| // Copyright 2020 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. |
| |
| // This file contains tests for the useless-assignment checker. |
| |
| package testdata |
| |
| import "math/rand" |
| |
| type ST struct { |
| x int |
| l []int |
| } |
| |
| func (s *ST) SetX(x int, ch chan int) { |
| // Accidental self-assignment; it should be "s.x = x" |
| x = x // want "self-assignment of x to x" |
| // Another mistake |
| s.x = s.x // want "self-assignment of s.x to s.x" |
| |
| s.l[0] = s.l[0] // want "self-assignment of s.l.0. to s.l.0." |
| |
| // Bail on any potential side effects to avoid false positives |
| s.l[num()] = s.l[num()] |
| rng := rand.New(rand.NewSource(0)) |
| s.l[rng.Intn(len(s.l))] = s.l[rng.Intn(len(s.l))] |
| s.l[<-ch] = s.l[<-ch] |
| } |
| |
| func num() int { return 2 } |
| |
| func Index() { |
| s := []int{1} |
| s[0] = s[0] // want "self-assignment" |
| |
| var a [5]int |
| a[0] = a[0] // want "self-assignment" |
| |
| pa := &[2]int{1, 2} |
| pa[1] = pa[1] // want "self-assignment" |
| |
| var pss *struct { // report self assignment despite nil dereference |
| s []int |
| } |
| pss.s[0] = pss.s[0] // want "self-assignment" |
| |
| m := map[int]string{1: "a"} |
| m[0] = m[0] // bail on map self-assignments due to side effects |
| m[1] = m[1] // not modeling what elements must be in the map |
| (m[2]) = (m[2]) // even with parens |
| type Map map[string]bool |
| named := make(Map) |
| named["s"] = named["s"] // even on named maps. |
| var psm *struct { |
| m map[string]int |
| } |
| psm.m["key"] = psm.m["key"] // handles dereferences |
| } |