1// errorcheck -0 -N -d=nil
2
3// Copyright 2013 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// Test that nil checks are inserted.
8// Optimization is disabled, so redundant checks are not removed.
9
10package p
11
12type Struct struct {
13	X int
14	Y float64
15}
16
17type BigStruct struct {
18	X int
19	Y float64
20	A [1<<20]int
21	Z string
22}
23
24type Empty struct {
25}
26
27type Empty1 struct {
28	Empty
29}
30
31var (
32	intp *int
33	arrayp *[10]int
34	array0p *[0]int
35	bigarrayp *[1<<26]int
36	structp *Struct
37	bigstructp *BigStruct
38	emptyp *Empty
39	empty1p *Empty1
40)
41
42func f1() {
43	_ = *intp // ERROR "nil check"
44	_ = *arrayp // ERROR "nil check"
45	_ = *array0p // ERROR "nil check"
46	_ = *array0p // ERROR "nil check"
47	_ = *intp // ERROR "nil check"
48	_ = *arrayp // ERROR "nil check"
49	_ = *structp // ERROR "nil check"
50	_ = *emptyp // ERROR "nil check"
51	_ = *arrayp // ERROR "nil check"
52}
53
54func f2() {
55	var (
56		intp *int
57		arrayp *[10]int
58		array0p *[0]int
59		bigarrayp *[1<<20]int
60		structp *Struct
61		bigstructp *BigStruct
62		emptyp *Empty
63		empty1p *Empty1
64	)
65
66	_ = *intp // ERROR "nil check"
67	_ = *arrayp // ERROR "nil check"
68	_ = *array0p // ERROR "nil check"
69	_ = *array0p // ERROR "nil check"
70	_ = *intp // ERROR "nil check"
71	_ = *arrayp // ERROR "nil check"
72	_ = *structp // ERROR "nil check"
73	_ = *emptyp // ERROR "nil check"
74	_ = *arrayp // ERROR "nil check"
75	_ = *bigarrayp // ERROR "nil check"
76	_ = *bigstructp // ERROR "nil check"
77	_ = *empty1p // ERROR "nil check"
78}
79
80func fx10k() *[10000]int
81var b bool
82
83
84func f3(x *[10000]int) {
85	// Using a huge type and huge offsets so the compiler
86	// does not expect the memory hardware to fault.
87	_ = x[9999] // ERROR "nil check"
88
89	for {
90		if x[9999] != 0 { // ERROR "nil check"
91			break
92		}
93	}
94
95	x = fx10k()
96	_ = x[9999] // ERROR "nil check"
97	if b {
98		_ = x[9999] // ERROR "nil check"
99	} else {
100		_ = x[9999] // ERROR "nil check"
101	}
102	_ = x[9999] // ERROR "nil check"
103
104	x = fx10k()
105	if b {
106		_ = x[9999] // ERROR "nil check"
107	} else {
108		_ = x[9999] // ERROR "nil check"
109	}
110	_ = x[9999] // ERROR "nil check"
111
112	fx10k()
113	// This one is a bit redundant, if we figured out that
114	// x wasn't going to change across the function call.
115	// But it's a little complex to do and in practice doesn't
116	// matter enough.
117	_ = x[9999] // ERROR "nil check"
118}
119
120func f3a() {
121	x := fx10k()
122	y := fx10k()
123	z := fx10k()
124	_ = &x[9] // ERROR "nil check"
125	y = z
126	_ = &x[9] // ERROR "nil check"
127	x = y
128	_ = &x[9] // ERROR "nil check"
129}
130
131func f3b() {
132	x := fx10k()
133	y := fx10k()
134	_ = &x[9] // ERROR "nil check"
135	y = x
136	_ = &x[9] // ERROR "nil check"
137	x = y
138	_ = &x[9] // ERROR "nil check"
139}
140
141func fx10() *[10]int
142
143func f4(x *[10]int) {
144	// Most of these have no checks because a real memory reference follows,
145	// and the offset is small enough that if x is nil, the address will still be
146	// in the first unmapped page of memory.
147
148	_ = x[9] // ERROR "nil check"
149
150	for {
151		if x[9] != 0 { // ERROR "nil check"
152			break
153		}
154	}
155
156	x = fx10()
157	_ = x[9] // ERROR "nil check"
158	if b {
159		_ = x[9] // ERROR "nil check"
160	} else {
161		_ = x[9] // ERROR "nil check"
162	}
163	_ = x[9] // ERROR "nil check"
164
165	x = fx10()
166	if b {
167		_ = x[9] // ERROR "nil check"
168	} else {
169		_ = &x[9] // ERROR "nil check"
170	}
171	_ = x[9] // ERROR "nil check"
172
173	fx10()
174	_ = x[9] // ERROR "nil check"
175
176	x = fx10()
177	y := fx10()
178	_ = &x[9] // ERROR "nil check"
179	y = x
180	_ = &x[9] // ERROR "nil check"
181	x = y
182	_ = &x[9] // ERROR "nil check"
183}
184
185