blob: 817d2aec74add66eed466668ef881631a79a0e94 [file] [log] [blame]
Russ Coxaa0439b2013-09-17 16:54:22 -04001// errorcheck -0 -d=nil
Shenghou Ma63d72f62015-04-04 01:24:36 -04002// Fails on ppc64x because of incomplete optimization.
3// See issues 9058.
Michael Mundaydae98d52016-03-20 19:35:59 -04004// Same reason for mips64x and s390x.
5// +build !ppc64,!ppc64le,!mips64,!mips64le,!amd64,!s390x
Russ Coxaa0439b2013-09-17 16:54:22 -04006
7// Copyright 2013 The Go Authors. All rights reserved.
8// Use of this source code is governed by a BSD-style
9// license that can be found in the LICENSE file.
10
11// Test that nil checks are removed.
12// Optimization is enabled.
13
14package p
15
16type Struct struct {
17 X int
18 Y float64
19}
20
21type BigStruct struct {
22 X int
23 Y float64
Russ Coxf5184d32014-05-15 15:34:53 -040024 A [1 << 20]int
Russ Coxaa0439b2013-09-17 16:54:22 -040025 Z string
26}
27
28type Empty struct {
29}
30
31type Empty1 struct {
32 Empty
33}
34
35var (
Russ Coxf5184d32014-05-15 15:34:53 -040036 intp *int
37 arrayp *[10]int
38 array0p *[0]int
39 bigarrayp *[1 << 26]int
40 structp *Struct
Russ Coxaa0439b2013-09-17 16:54:22 -040041 bigstructp *BigStruct
Russ Coxf5184d32014-05-15 15:34:53 -040042 emptyp *Empty
43 empty1p *Empty1
Russ Coxaa0439b2013-09-17 16:54:22 -040044)
45
46func f1() {
47 _ = *intp // ERROR "generated nil check"
Russ Coxf5184d32014-05-15 15:34:53 -040048
Russ Coxaa0439b2013-09-17 16:54:22 -040049 // This one should be removed but the block copy needs
50 // to be turned into its own pseudo-op in order to see
51 // the indirect.
52 _ = *arrayp // ERROR "generated nil check"
Russ Coxaa0439b2013-09-17 16:54:22 -040053
Russ Coxf5184d32014-05-15 15:34:53 -040054 // 0-byte indirect doesn't suffice.
55 // we don't registerize globals, so there are no removed repeated nil checks.
56 _ = *array0p // ERROR "generated nil check"
57 _ = *array0p // ERROR "generated nil check"
58
59 _ = *intp // ERROR "generated nil check"
60 _ = *arrayp // ERROR "generated nil check"
Russ Coxaa0439b2013-09-17 16:54:22 -040061 _ = *structp // ERROR "generated nil check"
Russ Coxf5184d32014-05-15 15:34:53 -040062 _ = *emptyp // ERROR "generated nil check"
63 _ = *arrayp // ERROR "generated nil check"
Russ Coxaa0439b2013-09-17 16:54:22 -040064}
65
66func f2() {
67 var (
Russ Coxf5184d32014-05-15 15:34:53 -040068 intp *int
69 arrayp *[10]int
70 array0p *[0]int
71 bigarrayp *[1 << 20]int
72 structp *Struct
Russ Coxaa0439b2013-09-17 16:54:22 -040073 bigstructp *BigStruct
Russ Coxf5184d32014-05-15 15:34:53 -040074 emptyp *Empty
75 empty1p *Empty1
Russ Coxaa0439b2013-09-17 16:54:22 -040076 )
77
Russ Coxf5184d32014-05-15 15:34:53 -040078 _ = *intp // ERROR "generated nil check"
79 _ = *arrayp // ERROR "generated nil check"
80 _ = *array0p // ERROR "generated nil check"
81 _ = *array0p // ERROR "removed repeated nil check"
82 _ = *intp // ERROR "removed repeated nil check"
83 _ = *arrayp // ERROR "removed repeated nil check"
84 _ = *structp // ERROR "generated nil check"
85 _ = *emptyp // ERROR "generated nil check"
86 _ = *arrayp // ERROR "removed repeated nil check"
87 _ = *bigarrayp // ERROR "generated nil check" ARM removed nil check before indirect!!
Russ Coxaa0439b2013-09-17 16:54:22 -040088 _ = *bigstructp // ERROR "generated nil check"
Russ Coxf5184d32014-05-15 15:34:53 -040089 _ = *empty1p // ERROR "generated nil check"
Russ Coxaa0439b2013-09-17 16:54:22 -040090}
91
92func fx10k() *[10000]int
Russ Coxaa0439b2013-09-17 16:54:22 -040093
Russ Coxf5184d32014-05-15 15:34:53 -040094var b bool
Russ Coxaa0439b2013-09-17 16:54:22 -040095
96func f3(x *[10000]int) {
97 // Using a huge type and huge offsets so the compiler
98 // does not expect the memory hardware to fault.
99 _ = x[9999] // ERROR "generated nil check"
Russ Coxf5184d32014-05-15 15:34:53 -0400100
Russ Coxaa0439b2013-09-17 16:54:22 -0400101 for {
102 if x[9999] != 0 { // ERROR "generated nil check"
103 break
104 }
105 }
Russ Coxf5184d32014-05-15 15:34:53 -0400106
107 x = fx10k()
Russ Coxaa0439b2013-09-17 16:54:22 -0400108 _ = x[9999] // ERROR "generated nil check"
109 if b {
110 _ = x[9999] // ERROR "removed repeated nil check"
111 } else {
112 _ = x[9999] // ERROR "removed repeated nil check"
Russ Coxf5184d32014-05-15 15:34:53 -0400113 }
Russ Coxaa0439b2013-09-17 16:54:22 -0400114 _ = x[9999] // ERROR "generated nil check"
115
Russ Coxf5184d32014-05-15 15:34:53 -0400116 x = fx10k()
Russ Coxaa0439b2013-09-17 16:54:22 -0400117 if b {
118 _ = x[9999] // ERROR "generated nil check"
119 } else {
120 _ = x[9999] // ERROR "generated nil check"
Russ Coxf5184d32014-05-15 15:34:53 -0400121 }
Russ Coxaa0439b2013-09-17 16:54:22 -0400122 _ = x[9999] // ERROR "generated nil check"
Russ Coxf5184d32014-05-15 15:34:53 -0400123
Russ Coxaa0439b2013-09-17 16:54:22 -0400124 fx10k()
125 // This one is a bit redundant, if we figured out that
126 // x wasn't going to change across the function call.
127 // But it's a little complex to do and in practice doesn't
128 // matter enough.
129 _ = x[9999] // ERROR "generated nil check"
130}
131
132func f3a() {
133 x := fx10k()
134 y := fx10k()
135 z := fx10k()
136 _ = &x[9] // ERROR "generated nil check"
137 y = z
138 _ = &x[9] // ERROR "removed repeated nil check"
139 x = y
140 _ = &x[9] // ERROR "generated nil check"
141}
142
143func f3b() {
144 x := fx10k()
145 y := fx10k()
146 _ = &x[9] // ERROR "generated nil check"
147 y = x
148 _ = &x[9] // ERROR "removed repeated nil check"
149 x = y
150 _ = &x[9] // ERROR "removed repeated nil check"
151}
152
Russ Coxf5184d32014-05-15 15:34:53 -0400153func fx10() *[10]int
Russ Coxaa0439b2013-09-17 16:54:22 -0400154
155func f4(x *[10]int) {
156 // Most of these have no checks because a real memory reference follows,
157 // and the offset is small enough that if x is nil, the address will still be
158 // in the first unmapped page of memory.
159
160 _ = x[9] // ERROR "removed nil check before indirect"
Russ Coxf5184d32014-05-15 15:34:53 -0400161
Russ Coxaa0439b2013-09-17 16:54:22 -0400162 for {
163 if x[9] != 0 { // ERROR "removed nil check before indirect"
164 break
165 }
166 }
Russ Coxf5184d32014-05-15 15:34:53 -0400167
168 x = fx10()
Russ Coxaa0439b2013-09-17 16:54:22 -0400169 _ = x[9] // ERROR "removed nil check before indirect"
170 if b {
171 _ = x[9] // ERROR "removed nil check before indirect"
172 } else {
173 _ = x[9] // ERROR "removed nil check before indirect"
174 }
175 _ = x[9] // ERROR "removed nil check before indirect"
176
Russ Coxf5184d32014-05-15 15:34:53 -0400177 x = fx10()
Russ Coxaa0439b2013-09-17 16:54:22 -0400178 if b {
179 _ = x[9] // ERROR "removed nil check before indirect"
180 } else {
181 _ = &x[9] // ERROR "generated nil check"
Russ Coxf5184d32014-05-15 15:34:53 -0400182 }
Russ Coxaa0439b2013-09-17 16:54:22 -0400183 _ = x[9] // ERROR "removed nil check before indirect"
Russ Coxf5184d32014-05-15 15:34:53 -0400184
Russ Coxaa0439b2013-09-17 16:54:22 -0400185 fx10()
186 _ = x[9] // ERROR "removed nil check before indirect"
Russ Coxf5184d32014-05-15 15:34:53 -0400187
Russ Coxaa0439b2013-09-17 16:54:22 -0400188 x = fx10()
189 y := fx10()
190 _ = &x[9] // ERROR "generated nil check"
191 y = x
192 _ = &x[9] // ERROR "removed repeated nil check"
193 x = y
194 _ = &x[9] // ERROR "removed repeated nil check"
195}