blob: 7e43ee4369c2d99a058bd4164b49b170775d911f [file] [log] [blame]
package a
type T1 struct{ x int }
type T2 struct {
x int
y int
}
type T3 struct{ y *T1 }
func BadWrites() {
// Test struct field writes.
var s1 T1
s1.x = 10 // want "unused write to field x"
// Test array writes.
var s2 [10]int
s2[1] = 10 // want "unused write to array index 1:int"
// Test range variables of struct type.
s3 := []T1{T1{x: 100}}
for i, v := range s3 {
v.x = i // want "unused write to field x"
}
// Test the case where a different field is read after the write.
s4 := []T2{T2{x: 1, y: 2}}
for i, v := range s4 {
v.x = i // want "unused write to field x"
_ = v.y
}
}
func (t T1) BadValueReceiverWrite(v T2) {
t.x = 10 // want "unused write to field x"
v.y = 20 // want "unused write to field y"
}
func GoodWrites(m map[int]int) {
// A map is copied by reference such that a write will affect the original map.
m[1] = 10
// Test struct field writes.
var s1 T1
s1.x = 10
print(s1.x)
// Test array writes.
var s2 [10]int
s2[1] = 10
// Current the checker doesn't distinguish index 1 and index 2.
_ = s2[2]
// Test range variables of struct type.
s3 := []T1{T1{x: 100}}
for i, v := range s3 { // v is a copy
v.x = i
_ = v.x // still a usage
}
// Test an object with multiple fields.
o := &T2{x: 10, y: 20}
print(o)
// Test an object of embedded struct/pointer type.
t1 := &T1{x: 10}
t2 := &T3{y: t1}
print(t2)
}
func (t *T1) GoodPointerReceiverWrite(v *T2) {
t.x = 10
v.y = 20
}