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