1// errorcheck -0 -d=nil
2
3// +build !wasm
4// +build !aix
5
6// Copyright 2013 The Go Authors. All rights reserved.
7// Use of this source code is governed by a BSD-style
8// license that can be found in the LICENSE file.
9
10// Test that nil checks are removed.
11// Optimization is enabled.
12
13package p
14
15type Struct struct {
16	X int
17	Y float64
18}
19
20type BigStruct struct {
21	X int
22	Y float64
23	A [1 << 20]int
24	Z string
25}
26
27type Empty struct {
28}
29
30type Empty1 struct {
31	Empty
32}
33
34var (
35	intp       *int
36	arrayp     *[10]int
37	array0p    *[0]int
38	bigarrayp  *[1 << 26]int
39	structp    *Struct
40	bigstructp *BigStruct
41	emptyp     *Empty
42	empty1p    *Empty1
43)
44
45func f1() {
46	_ = *intp // ERROR "generated nil check"
47
48	// This one should be removed but the block copy needs
49	// to be turned into its own pseudo-op in order to see
50	// the indirect.
51	_ = *arrayp // ERROR "generated nil check"
52
53	// 0-byte indirect doesn't suffice.
54	// we don't registerize globals, so there are no removed.* nil checks.
55	_ = *array0p // ERROR "generated nil check"
56	_ = *array0p // ERROR "removed nil check"
57
58	_ = *intp    // ERROR "removed nil check"
59	_ = *arrayp  // ERROR "removed nil check"
60	_ = *structp // ERROR "generated nil check"
61	_ = *emptyp  // ERROR "generated nil check"
62	_ = *arrayp  // ERROR "removed nil check"
63}
64
65func f2() {
66	var (
67		intp       *int
68		arrayp     *[10]int
69		array0p    *[0]int
70		bigarrayp  *[1 << 20]int
71		structp    *Struct
72		bigstructp *BigStruct
73		emptyp     *Empty
74		empty1p    *Empty1
75	)
76
77	_ = *intp       // ERROR "generated nil check"
78	_ = *arrayp     // ERROR "generated nil check"
79	_ = *array0p    // ERROR "generated nil check"
80	_ = *array0p    // ERROR "removed.* nil check"
81	_ = *intp       // ERROR "removed.* nil check"
82	_ = *arrayp     // ERROR "removed.* nil check"
83	_ = *structp    // ERROR "generated nil check"
84	_ = *emptyp     // ERROR "generated nil check"
85	_ = *arrayp     // ERROR "removed.* nil check"
86	_ = *bigarrayp  // ERROR "generated nil check" ARM removed nil check before indirect!!
87	_ = *bigstructp // ERROR "generated nil check"
88	_ = *empty1p    // ERROR "generated nil check"
89}
90
91func fx10k() *[10000]int
92
93var b bool
94
95func f3(x *[10000]int) {
96	// Using a huge type and huge offsets so the compiler
97	// does not expect the memory hardware to fault.
98	_ = x[9999] // ERROR "generated nil check"
99
100	for {
101		if x[9999] != 0 { // ERROR "removed nil check"
102			break
103		}
104	}
105
106	x = fx10k()
107	_ = x[9999] // ERROR "generated nil check"
108	if b {
109		_ = x[9999] // ERROR "removed.* nil check"
110	} else {
111		_ = x[9999] // ERROR "removed.* nil check"
112	}
113	_ = x[9999] // ERROR "removed nil check"
114
115	x = fx10k()
116	if b {
117		_ = x[9999] // ERROR "generated nil check"
118	} else {
119		_ = x[9999] // ERROR "generated nil check"
120	}
121	_ = x[9999] // ERROR "generated nil check"
122
123	fx10k()
124	// This one is a bit redundant, if we figured out that
125	// x wasn't going to change across the function call.
126	// But it's a little complex to do and in practice doesn't
127	// matter enough.
128	_ = x[9999] // ERROR "removed nil check"
129}
130
131func f3a() {
132	x := fx10k()
133	y := fx10k()
134	z := fx10k()
135	_ = &x[9] // ERROR "generated nil check"
136	y = z
137	_ = &x[9] // ERROR "removed.* nil check"
138	x = y
139	_ = &x[9] // ERROR "generated nil check"
140}
141
142func f3b() {
143	x := fx10k()
144	y := fx10k()
145	_ = &x[9] // ERROR "generated nil check"
146	y = x
147	_ = &x[9] // ERROR "removed.* nil check"
148	x = y
149	_ = &x[9] // ERROR "removed.* nil check"
150}
151
152func fx10() *[10]int
153
154func f4(x *[10]int) {
155	// Most of these have no checks because a real memory reference follows,
156	// and the offset is small enough that if x is nil, the address will still be
157	// in the first unmapped page of memory.
158
159	_ = x[9] // ERROR "generated nil check" // bug: would like to remove this check (but nilcheck and load are in different blocks)
160
161	for {
162		if x[9] != 0 { // ERROR "removed nil check"
163			break
164		}
165	}
166
167	x = fx10()
168	_ = x[9] // ERROR "generated nil check" // bug would like to remove before indirect
169	if b {
170		_ = x[9] // ERROR "removed nil check"
171	} else {
172		_ = x[9] // ERROR "removed nil check"
173	}
174	_ = x[9] // ERROR "removed nil check"
175
176	x = fx10()
177	if b {
178		_ = x[9] // ERROR "generated nil check"  // bug would like to remove before indirect
179	} else {
180		_ = &x[9] // ERROR "generated nil check"
181	}
182	_ = x[9] // ERROR "generated nil check"  // bug would like to remove before indirect
183
184	fx10()
185	_ = x[9] // ERROR "removed nil check"
186
187	x = fx10()
188	y := fx10()
189	_ = &x[9] // ERROR "generated nil check"
190	y = x
191	_ = &x[9] // ERROR "removed[a-z ]* nil check"
192	x = y
193	_ = &x[9] // ERROR "removed[a-z ]* nil check"
194}
195
196func m1(m map[int][80]byte) byte {
197	v := m[3] // ERROR "removed nil check"
198	return v[5]
199}
200func m2(m map[int][800]byte) byte {
201	v := m[3] // ERROR "removed nil check"
202	return v[5]
203}
204func m3(m map[int][80]byte) (byte, bool) {
205	v, ok := m[3] // ERROR "removed nil check"
206	return v[5], ok
207}
208func m4(m map[int][800]byte) (byte, bool) {
209	v, ok := m[3] // ERROR "removed nil check"
210	return v[5], ok
211}
212func p1() byte {
213	p := new([100]byte)
214	return p[5] // ERROR "removed nil check"
215}
216
217type SS struct {
218	x byte
219}
220
221type TT struct {
222	SS
223}
224
225func f(t *TT) *byte {
226	// See issue 17242.
227	s := &t.SS  // ERROR "generated nil check"
228	return &s.x // ERROR "removed nil check"
229}
230
231// make sure not to do nil check for newobject
232func f7() (*Struct, float64) {
233	t := new(Struct)
234	p := &t.Y    // ERROR "removed nil check"
235	return t, *p // ERROR "removed nil check"
236}
237
238func f9() []int {
239	x := new([1]int)
240	x[0] = 1  // ERROR "removed nil check"
241	y := x[:] // ERROR "removed nil check"
242	return y
243}
244