| // errorcheck -0 -d=wb | |
| // Copyright 2019 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. | |
| // Make sure we don't introduce write barriers where we | |
| // don't need them. These cases are writing pointers to | |
| // globals to zeroed memory. | |
| package main | |
| func f1() []string { | |
| return []string{"a"} | |
| } | |
| func f2() []string { | |
| return []string{"a", "b"} | |
| } | |
| type T struct { | |
| a [6]*int | |
| } | |
| func f3() *T { | |
| t := new(T) | |
| t.a[0] = &g | |
| t.a[1] = &g | |
| t.a[2] = &g | |
| t.a[3] = &g | |
| t.a[4] = &g | |
| t.a[5] = &g | |
| return t | |
| } | |
| func f4() *T { | |
| t := new(T) | |
| t.a[5] = &g | |
| t.a[4] = &g | |
| t.a[3] = &g | |
| t.a[2] = &g | |
| t.a[1] = &g | |
| t.a[0] = &g | |
| return t | |
| } | |
| func f5() *T { | |
| t := new(T) | |
| t.a[4] = &g | |
| t.a[2] = &g | |
| t.a[0] = &g | |
| t.a[3] = &g | |
| t.a[1] = &g | |
| t.a[5] = &g | |
| return t | |
| } | |
| type U struct { | |
| a [65]*int | |
| } | |
| func f6() *U { | |
| u := new(U) | |
| u.a[63] = &g | |
| // This offset is too large: we only track the first 64 pointers for zeroness. | |
| u.a[64] = &g // ERROR "write barrier" | |
| return u | |
| } | |
| var g int |