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