| // 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 |