1// errorcheck -0 -d=wb
2
3// Copyright 2019 The Go Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7// Make sure we don't introduce write barriers where we
8// don't need them. These cases are writing pointers to
9// globals to zeroed memory.
10
11package main
12
13func f1() []string {
14	return []string{"a"}
15}
16
17func f2() []string {
18	return []string{"a", "b"}
19}
20
21type T struct {
22	a [6]*int
23}
24
25func f3() *T {
26	t := new(T)
27	t.a[0] = &g
28	t.a[1] = &g
29	t.a[2] = &g
30	t.a[3] = &g
31	t.a[4] = &g
32	t.a[5] = &g
33	return t
34}
35
36func f4() *T {
37	t := new(T)
38	t.a[5] = &g
39	t.a[4] = &g
40	t.a[3] = &g
41	t.a[2] = &g
42	t.a[1] = &g
43	t.a[0] = &g
44	return t
45}
46
47func f5() *T {
48	t := new(T)
49	t.a[4] = &g
50	t.a[2] = &g
51	t.a[0] = &g
52	t.a[3] = &g
53	t.a[1] = &g
54	t.a[5] = &g
55	return t
56}
57
58type U struct {
59	a [65]*int
60}
61
62func f6() *U {
63	u := new(U)
64	u.a[63] = &g
65	// This offset is too large: we only track the first 64 pointers for zeroness.
66	u.a[64] = &g // ERROR "write barrier"
67	return u
68}
69
70var g int
71