1// run 2 3// Copyright 2022 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 the compiler's noder uses the correct type 8// for RHS shift operands that are untyped. Must compile; 9// run for good measure. 10 11package main 12 13import ( 14 "fmt" 15 "math" 16) 17 18func f(x, y int) { 19 if x != y { 20 panic(fmt.Sprintf("%d != %d", x, y)) 21 } 22} 23 24func main() { 25 var x int = 1 26 f(x<<1, 2) 27 f(x<<1., 2) 28 f(x<<(1+0i), 2) 29 f(x<<0i, 1) 30 31 f(x<<(1<<x), 4) 32 f(x<<(1.<<x), 4) 33 f(x<<((1+0i)<<x), 4) 34 f(x<<(0i<<x), 1) 35 36 // corner cases 37 const M = math.MaxUint 38 f(x<<(M+0), 0) // shift by untyped int representable as uint 39 f(x<<(M+0.), 0) // shift by untyped float representable as uint 40 f(x<<(M+0.+0i), 0) // shift by untyped complex representable as uint 41} 42