--- /dev/null
+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
+}