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