blob: 99c3c5fdb6f150033d3eb2013b60cac015990187 [file] [log] [blame]
Russ Cox999a36f2013-08-15 14:38:32 -04001// 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
Josh Bleecher Snyder43e69232014-12-22 11:33:47 -0800185func f5(m map[string]struct{}) bool {
186 // Existence-only map lookups should not generate a nil check
187 _, ok := m[""]
188 return ok
189}