]> Cypherpunks.ru repositories - gostls13.git/blob - test/nilptr3.go
[dev.garbage] Merge remote-tracking branch 'origin/master' into HEAD
[gostls13.git] / test / nilptr3.go
1 // errorcheck -0 -d=nil
2 // Fails on ppc64x because of incomplete optimization.
3 // See issues 9058.
4 // Same reason for mips64x and s390x.
5 // +build !ppc64,!ppc64le,!mips64,!mips64le,!amd64,!s390x
6
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
14 package p
15
16 type Struct struct {
17         X int
18         Y float64
19 }
20
21 type BigStruct struct {
22         X int
23         Y float64
24         A [1 << 20]int
25         Z string
26 }
27
28 type Empty struct {
29 }
30
31 type Empty1 struct {
32         Empty
33 }
34
35 var (
36         intp       *int
37         arrayp     *[10]int
38         array0p    *[0]int
39         bigarrayp  *[1 << 26]int
40         structp    *Struct
41         bigstructp *BigStruct
42         emptyp     *Empty
43         empty1p    *Empty1
44 )
45
46 func f1() {
47         _ = *intp // ERROR "generated nil check"
48
49         // 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"
53
54         // 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"
61         _ = *structp // ERROR "generated nil check"
62         _ = *emptyp  // ERROR "generated nil check"
63         _ = *arrayp  // ERROR "generated nil check"
64 }
65
66 func f2() {
67         var (
68                 intp       *int
69                 arrayp     *[10]int
70                 array0p    *[0]int
71                 bigarrayp  *[1 << 20]int
72                 structp    *Struct
73                 bigstructp *BigStruct
74                 emptyp     *Empty
75                 empty1p    *Empty1
76         )
77
78         _ = *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!!
88         _ = *bigstructp // ERROR "generated nil check"
89         _ = *empty1p    // ERROR "generated nil check"
90 }
91
92 func fx10k() *[10000]int
93
94 var b bool
95
96 func 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"
100
101         for {
102                 if x[9999] != 0 { // ERROR "generated nil check"
103                         break
104                 }
105         }
106
107         x = fx10k()
108         _ = 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"
113         }
114         _ = x[9999] // ERROR "generated nil check"
115
116         x = fx10k()
117         if b {
118                 _ = x[9999] // ERROR "generated nil check"
119         } else {
120                 _ = x[9999] // ERROR "generated nil check"
121         }
122         _ = x[9999] // ERROR "generated nil check"
123
124         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
132 func 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
143 func 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
153 func fx10() *[10]int
154
155 func 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"
161
162         for {
163                 if x[9] != 0 { // ERROR "removed nil check before indirect"
164                         break
165                 }
166         }
167
168         x = fx10()
169         _ = 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
177         x = fx10()
178         if b {
179                 _ = x[9] // ERROR "removed nil check before indirect"
180         } else {
181                 _ = &x[9] // ERROR "generated nil check"
182         }
183         _ = x[9] // ERROR "removed nil check before indirect"
184
185         fx10()
186         _ = x[9] // ERROR "removed nil check before indirect"
187
188         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 }
196
197 func m1(m map[int][80]byte) byte {
198         v := m[3] // ERROR "removed nil check"
199         return v[5]
200 }
201 func m2(m map[int][800]byte) byte {
202         v := m[3] // ERROR "removed nil check"
203         return v[5]
204 }
205 func m3(m map[int][80]byte) (byte, bool) {
206         v, ok := m[3] // ERROR "removed nil check"
207         return v[5], ok
208 }
209 func m4(m map[int][800]byte) (byte, bool) {
210         v, ok := m[3] // ERROR "removed nil check"
211         return v[5], ok
212 }
213 func p1() byte {
214         p := new([100]byte)
215         return p[5] // ERROR "removed nil check"
216 }