modernc.org/gc@v1.0.1-0.20240304020402-f0dba7c97c2b/testdata/errchk/test/shift2.go (about) 1 // compile 2 3 // Copyright 2011 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 legal shifts. 8 // Issue 1708, legal cases. 9 // Compiles but does not run. 10 11 package p 12 13 func f(x int) int { return 0 } 14 func g(x interface{}) int { return 0 } 15 func h(x float64) int { return 0 } 16 17 // from the spec 18 var ( 19 s uint = 33 20 i = 1 << s // 1 has type int 21 j int32 = 1 << s // 1 has type int32; j == 0 22 k = uint64(1 << s) // 1 has type uint64; k == 1<<33 23 l = g(1 << s) // 1 has type int 24 m int = 1.0 << s // legal: 1.0 has type int 25 w int64 = 1.0 << 33 // legal: 1.0<<33 is a constant shift expression 26 ) 27 28 // non-constant shift expressions 29 var ( 30 a1 int = 2.0 << s // typeof(2.0) is int in this context => legal shift 31 d1 = f(2.0 << s) // typeof(2.0) is int in this context => legal shift 32 ) 33 34 // constant shift expressions 35 const c uint = 5 36 37 var ( 38 a2 int = 2.0 << c // a2 == 64 (type int) 39 b2 = 2.0 << c // b2 == 64 (untyped integer) 40 _ = f(b2) // verify b2 has type int 41 c2 float64 = 2 << c // c2 == 64.0 (type float64) 42 d2 = f(2.0 << c) // == f(64) 43 e2 = g(2.0 << c) // == g(int(64)) 44 f2 = h(2 << c) // == h(float64(64.0)) 45 )