github.com/yanyiwu/go@v0.0.0-20150106053140-03d6637dbb7f/test/nilptr3.go (about) 1 // errorcheck -0 -d=nil 2 // Fails on ppc64x because of incomplete optimization. See issue 9058. 3 // +build !ppc64,!ppc64le 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 repeated nil checks. 54 _ = *array0p // ERROR "generated nil check" 55 _ = *array0p // ERROR "generated nil check" 56 57 _ = *intp // ERROR "generated nil check" 58 _ = *arrayp // ERROR "generated nil check" 59 _ = *structp // ERROR "generated nil check" 60 _ = *emptyp // ERROR "generated nil check" 61 _ = *arrayp // ERROR "generated 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 repeated nil check" 80 _ = *intp // ERROR "removed repeated nil check" 81 _ = *arrayp // ERROR "removed repeated nil check" 82 _ = *structp // ERROR "generated nil check" 83 _ = *emptyp // ERROR "generated nil check" 84 _ = *arrayp // ERROR "removed repeated 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 "generated 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 repeated nil check" 109 } else { 110 _ = x[9999] // ERROR "removed repeated nil check" 111 } 112 _ = x[9999] // ERROR "generated 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 "generated 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 repeated 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 repeated nil check" 147 x = y 148 _ = &x[9] // ERROR "removed repeated 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 "removed nil check before indirect" 159 160 for { 161 if x[9] != 0 { // ERROR "removed nil check before indirect" 162 break 163 } 164 } 165 166 x = fx10() 167 _ = x[9] // ERROR "removed nil check before indirect" 168 if b { 169 _ = x[9] // ERROR "removed nil check before indirect" 170 } else { 171 _ = x[9] // ERROR "removed nil check before indirect" 172 } 173 _ = x[9] // ERROR "removed nil check before indirect" 174 175 x = fx10() 176 if b { 177 _ = x[9] // ERROR "removed nil check before indirect" 178 } else { 179 _ = &x[9] // ERROR "generated nil check" 180 } 181 _ = x[9] // ERROR "removed nil check before indirect" 182 183 fx10() 184 _ = x[9] // ERROR "removed nil check before indirect" 185 186 x = fx10() 187 y := fx10() 188 _ = &x[9] // ERROR "generated nil check" 189 y = x 190 _ = &x[9] // ERROR "removed repeated nil check" 191 x = y 192 _ = &x[9] // ERROR "removed repeated nil check" 193 }