github.com/miolini/go@v0.0.0-20160405192216-fca68c8cb408/test/nilptr3.go (about) 1 // errorcheck -0 -d=nil 2 // Fails on ppc64x because of incomplete optimization. 3 // See issues 9058. 4 // Same reason for mips64x. 5 // +build !ppc64,!ppc64le,!mips64,!mips64le,!amd64 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 }