github.com/remobjects/goldbaselibrary@v0.0.0-20230924164425-d458680a936b/Source/Gold/types/testdata/shifts.src (about) 1 // Copyright 2013 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package shifts 6 7 func shifts0() { 8 // basic constant shifts 9 const ( 10 s = 10 11 _ = 0<<0 12 _ = 1<<s 13 _ = 1<<- /* ERROR "negative shift count" */ 1 14 // For the test below we may decide to convert to int 15 // rather than uint and then report a negative shift 16 // count instead, which might be a better error. The 17 // (minor) difference is that this would restrict the 18 // shift count range by half (from all uint values to 19 // the positive int values). 20 // This depends on the exact spec wording which is not 21 // done yet. 22 // TODO(gri) revisit and adjust when spec change is done 23 _ = 1<<- /* ERROR "truncated to uint" */ 1.0 24 _ = 1<<1075 /* ERROR "invalid shift" */ 25 _ = 2.0<<1 26 _ = 1<<1.0 27 _ = 1<<(1+0i) 28 29 _ int = 2<<s 30 _ float32 = 2<<s 31 _ complex64 = 2<<s 32 33 _ int = 2.0<<s 34 _ float32 = 2.0<<s 35 _ complex64 = 2.0<<s 36 37 _ int = 'a'<<s 38 _ float32 = 'a'<<s 39 _ complex64 = 'a'<<s 40 ) 41 } 42 43 func shifts1() { 44 // basic non-constant shifts 45 var ( 46 i int 47 u uint 48 49 _ = 1<<0 50 _ = 1<<i 51 _ = 1<<u 52 _ = 1<<"foo" /* ERROR "cannot convert" */ 53 _ = i<<0 54 _ = i<<- /* ERROR "negative shift count" */ 1 55 _ = i<<1.0 56 _ = 1<<(1+0i) 57 _ = 1 /* ERROR "overflows" */ <<100 58 59 _ uint = 1 << 0 60 _ uint = 1 << u 61 _ float32 = 1 /* ERROR "must be integer" */ << u 62 63 // for issue 14822 64 _ = 1<<( /* ERROR "invalid shift count" */ 1<<64-1) 65 _ = 1<<( /* ERROR "invalid shift count" */ 1<<64) 66 _ = u<<(1<<63) // valid 67 _ = u<<(1<<64) // valid 68 ) 69 } 70 71 func shifts2() { 72 // from the spec 73 var ( 74 s uint = 33 75 i = 1<<s // 1 has type int 76 j int32 = 1<<s // 1 has type int32; j == 0 77 k = uint64(1<<s) // 1 has type uint64; k == 1<<33 78 m int = 1.0<<s // 1.0 has type int 79 n = 1.0<<s != i // 1.0 has type int; n == false if ints are 32bits in size 80 o = 1<<s == 2<<s // 1 and 2 have type int; o == true if ints are 32bits in size 81 p = 1<<s == 1<<33 // illegal if ints are 32bits in size: 1 has type int, but 1<<33 overflows int 82 u = 1.0 /* ERROR "must be integer" */ <<s // illegal: 1.0 has type float64, cannot shift 83 u1 = 1.0 /* ERROR "must be integer" */ <<s != 0 // illegal: 1.0 has type float64, cannot shift 84 u2 = 1 /* ERROR "must be integer" */ <<s != 1.0 // illegal: 1 has type float64, cannot shift 85 v float32 = 1 /* ERROR "must be integer" */ <<s // illegal: 1 has type float32, cannot shift 86 w int64 = 1.0<<33 // 1.0<<33 is a constant shift expression 87 ) 88 _, _, _, _, _, _, _, _, _, _, _, _ = i, j, k, m, n, o, p, u, u1, u2, v, w 89 } 90 91 func shifts3(a int16, b float32) { 92 // random tests 93 var ( 94 s uint = 11 95 u = 1 /* ERROR "must be integer" */ <<s + 1.0 96 v complex128 = 1 /* ERROR "must be integer" */ << s + 1.0 /* ERROR "must be integer" */ << s + 1 97 ) 98 x := 1.0 /* ERROR "must be integer" */ <<s + 1 99 shifts3(1.0 << s, 1 /* ERROR "must be integer" */ >> s) 100 _, _, _ = u, v, x 101 } 102 103 func shifts4() { 104 // shifts in comparisons w/ untyped operands 105 var s uint 106 107 _ = 1<<s == 1 108 _ = 1 /* ERROR "integer" */ <<s == 1. 109 _ = 1. /* ERROR "integer" */ <<s == 1 110 _ = 1. /* ERROR "integer" */ <<s == 1. 111 112 _ = 1<<s + 1 == 1 113 _ = 1 /* ERROR "integer" */ <<s + 1 == 1. 114 _ = 1 /* ERROR "integer" */ <<s + 1. == 1 115 _ = 1 /* ERROR "integer" */ <<s + 1. == 1. 116 _ = 1. /* ERROR "integer" */ <<s + 1 == 1 117 _ = 1. /* ERROR "integer" */ <<s + 1 == 1. 118 _ = 1. /* ERROR "integer" */ <<s + 1. == 1 119 _ = 1. /* ERROR "integer" */ <<s + 1. == 1. 120 121 _ = 1<<s == 1<<s 122 _ = 1 /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s 123 _ = 1. /* ERROR "integer" */ <<s == 1 /* ERROR "integer" */ <<s 124 _ = 1. /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s 125 126 _ = 1<<s + 1<<s == 1 127 _ = 1 /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1. 128 _ = 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1 129 _ = 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1. 130 _ = 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1 131 _ = 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1. 132 _ = 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1 133 _ = 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1. 134 135 _ = 1<<s + 1<<s == 1<<s + 1<<s 136 _ = 1 /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s 137 _ = 1 /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s 138 _ = 1 /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s 139 _ = 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1 /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s 140 _ = 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s 141 _ = 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s 142 _ = 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s 143 _ = 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1 /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s 144 _ = 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s 145 _ = 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s 146 _ = 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s 147 _ = 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1 /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s 148 _ = 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s 149 _ = 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s 150 _ = 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s 151 } 152 153 func shifts5() { 154 // shifts in comparisons w/ typed operands 155 var s uint 156 var x int 157 158 _ = 1<<s == x 159 _ = 1.<<s == x 160 _ = 1.1 /* ERROR "int" */ <<s == x 161 162 _ = 1<<s + x == 1 163 _ = 1<<s + x == 1. 164 _ = 1<<s + x == 1.1 /* ERROR "int" */ 165 _ = 1.<<s + x == 1 166 _ = 1.<<s + x == 1. 167 _ = 1.<<s + x == 1.1 /* ERROR "int" */ 168 _ = 1.1 /* ERROR "int" */ <<s + x == 1 169 _ = 1.1 /* ERROR "int" */ <<s + x == 1. 170 _ = 1.1 /* ERROR "int" */ <<s + x == 1.1 171 172 _ = 1<<s == x<<s 173 _ = 1.<<s == x<<s 174 _ = 1.1 /* ERROR "int" */ <<s == x<<s 175 } 176 177 func shifts6() { 178 // shifts as operands in non-arithmetic operations and as arguments 179 var a [10]int 180 var s uint 181 182 _ = a[1<<s] 183 _ = a[1.0] 184 _ = a[1.0<<s] 185 186 _ = make([]int, 1.0) 187 _ = make([]int, 1.0<<s) 188 _ = make([]int, 1.1 /* ERROR "must be integer" */ <<s) 189 190 _ = float32(1) 191 _ = float32(1 /* ERROR "must be integer" */ <<s) 192 _ = float32(1.0) 193 _ = float32(1.0 /* ERROR "must be integer" */ <<s) 194 _ = float32(1.1 /* ERROR "must be integer" */ <<s) 195 196 var b []int 197 _ = append(b, 1<<s) 198 _ = append(b, 1.0<<s) 199 _ = append(b, 1.1 /* ERROR "must be integer" */ <<s) 200 201 _ = append(b, 1<<s) 202 _ = append(b, 1.0<<s) // should fail - see TODO in append code 203 _ = append(b, 1.1 /* ERROR "must be integer" */ <<s) 204 205 _ = complex(1.0 /* ERROR "must be integer" */ <<s, 0) 206 _ = complex(1.1 /* ERROR "must be integer" */ <<s, 0) 207 _ = complex(0, 1.0 /* ERROR "must be integer" */ <<s) 208 _ = complex(0, 1.1 /* ERROR "must be integer" */ <<s) 209 210 // TODO(gri) The delete below is not type-checked correctly yet. 211 // var m1 map[int]string 212 // delete(m1, 1<<s) 213 } 214 215 func shifts7() { 216 // shifts of shifts 217 var s uint 218 var x int 219 _ = x 220 221 _ = 1<<(1<<s) 222 _ = 1<<(1.<<s) 223 _ = 1. /* ERROR "integer" */ <<(1<<s) 224 _ = 1. /* ERROR "integer" */ <<(1.<<s) 225 226 x = 1<<(1<<s) 227 x = 1<<(1.<<s) 228 x = 1.<<(1<<s) 229 x = 1.<<(1.<<s) 230 231 _ = (1<<s)<<(1<<s) 232 _ = (1<<s)<<(1.<<s) 233 _ = ( /* ERROR "integer" */ 1.<<s)<<(1<<s) 234 _ = ( /* ERROR "integer" */ 1.<<s)<<(1.<<s) 235 236 x = (1<<s)<<(1<<s) 237 x = (1<<s)<<(1.<<s) 238 x = ( /* ERROR "integer" */ 1.<<s)<<(1<<s) 239 x = ( /* ERROR "integer" */ 1.<<s)<<(1.<<s) 240 } 241 242 func shifts8() { 243 // shift examples from shift discussion: better error messages 244 var s uint 245 _ = 1.0 /* ERROR "shifted operand 1.0 \(type float64\) must be integer" */ <<s == 1 246 _ = 1.0 /* ERROR "shifted operand 1.0 \(type float64\) must be integer" */ <<s == 1.0 247 _ = 1 /* ERROR "shifted operand 1 \(type float64\) must be integer" */ <<s == 1.0 248 _ = 1 /* ERROR "shifted operand 1 \(type float64\) must be integer" */ <<s + 1.0 == 1 249 _ = 1 /* ERROR "shifted operand 1 \(type float64\) must be integer" */ <<s + 1.1 == 1 250 _ = 1 /* ERROR "shifted operand 1 \(type float64\) must be integer" */ <<s + 1 == 1.0 251 252 // additional cases 253 _ = complex(1.0 /* ERROR "shifted operand 1.0 \(type float64\) must be integer" */ <<s, 1) 254 _ = complex(1.0, 1 /* ERROR "shifted operand 1 \(type float64\) must be integer" */ <<s) 255 256 _ = int(1.<<s) 257 _ = int(1.1 /* ERROR "shifted operand .* must be integer" */ <<s) 258 _ = float32(1 /* ERROR "shifted operand .* must be integer" */ <<s) 259 _ = float32(1. /* ERROR "shifted operand .* must be integer" */ <<s) 260 _ = float32(1.1 /* ERROR "shifted operand .* must be integer" */ <<s) 261 // TODO(gri) the error messages for these two are incorrect - disabled for now 262 // _ = complex64(1<<s) 263 // _ = complex64(1.<<s) 264 _ = complex64(1.1 /* ERROR "shifted operand .* must be integer" */ <<s) 265 } 266 267 func shifts9() { 268 // various originally failing snippets of code from the std library 269 // from src/compress/lzw/reader.go:90 270 { 271 var d struct { 272 bits uint32 273 width uint 274 } 275 _ = uint16(d.bits & (1<<d.width - 1)) 276 } 277 278 // from src/debug/dwarf/buf.go:116 279 { 280 var ux uint64 281 var bits uint 282 x := int64(ux) 283 if x&(1<<(bits-1)) != 0 {} 284 } 285 286 // from src/encoding/asn1/asn1.go:160 287 { 288 var bytes []byte 289 if bytes[len(bytes)-1]&((1<<bytes[0])-1) != 0 {} 290 } 291 292 // from src/math/big/rat.go:140 293 { 294 var exp int 295 var mantissa uint64 296 shift := uint64(-1022 - (exp - 1)) // [1..53) 297 _ = mantissa & (1<<shift - 1) 298 } 299 300 // from src/net/interface.go:51 301 { 302 type Flags uint 303 var f Flags 304 var i int 305 if f&(1<<uint(i)) != 0 {} 306 } 307 308 // from src/runtime/softfloat64.go:234 309 { 310 var gm uint64 311 var shift uint 312 _ = gm & (1<<shift - 1) 313 } 314 315 // from src/strconv/atof.go:326 316 { 317 var mant uint64 318 var mantbits uint 319 if mant == 2<<mantbits {} 320 } 321 322 // from src/route_bsd.go:82 323 { 324 var Addrs int32 325 const rtaRtMask = 1 326 var i uint 327 if Addrs&rtaRtMask&(1<<i) == 0 {} 328 } 329 330 // from src/text/scanner/scanner.go:540 331 { 332 var s struct { Whitespace uint64 } 333 var ch rune 334 for s.Whitespace&(1<<uint(ch)) != 0 {} 335 } 336 } 337 338 func issue5895() { 339 var x = 'a' << 1 // type of x must be rune 340 var _ rune = x 341 } 342 343 func issue11325() { 344 var _ = 0 >> 1.1 /* ERROR "truncated to uint" */ // example from issue 11325 345 _ = 0 >> 1.1 /* ERROR "truncated to uint" */ 346 _ = 0 << 1.1 /* ERROR "truncated to uint" */ 347 _ = 0 >> 1. 348 _ = 1 >> 1.1 /* ERROR "truncated to uint" */ 349 _ = 1 >> 1. 350 _ = 1. >> 1 351 _ = 1. >> 1. 352 _ = 1.1 /* ERROR "must be integer" */ >> 1 353 } 354 355 func issue11594() { 356 var _ = complex64 /* ERROR "must be integer" */ (1) << 2 // example from issue 11594 357 _ = float32 /* ERROR "must be integer" */ (0) << 1 358 _ = float64 /* ERROR "must be integer" */ (0) >> 2 359 _ = complex64 /* ERROR "must be integer" */ (0) << 3 360 _ = complex64 /* ERROR "must be integer" */ (0) >> 4 361 } 362 363 func issue21727() { 364 var s uint 365 var a = make([]int, 1<<s + 1.2 /* ERROR "truncated to int" */ ) 366 var _ = a[1<<s - 2.3 /* ERROR "truncated to int" */ ] 367 var _ int = 1<<s + 3.4 /* ERROR "truncated to int" */ 368 var _ = string(1 << s) 369 var _ = string(1.0 /* ERROR "cannot convert" */ << s) 370 } 371 372 func issue22969() { 373 var s uint 374 var a []byte 375 _ = a[0xffffffffffffffff /* ERROR "overflows int" */ <<s] // example from issue 22969 376 _ = make([]int, 0xffffffffffffffff /* ERROR "overflows int" */ << s) 377 _ = make([]int, 0, 0xffffffffffffffff /* ERROR "overflows int" */ << s) 378 var _ byte = 0x100 /* ERROR "overflows byte" */ << s 379 var _ int8 = 0xff /* ERROR "overflows int8" */ << s 380 var _ int16 = 0xffff /* ERROR "overflows int16" */ << s 381 var _ int32 = 0x80000000 /* ERROR "overflows int32" */ << s 382 }