// run // Copyright 2019 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package main import "reflect" var tests = []interface{}{ func(x int, s int) int { return x << s }, func(x int, s int64) int { return x << s }, func(x int, s int32) int { return x << s }, func(x int, s int16) int { return x << s }, func(x int, s int8) int { return x << s }, func(x int, s int) int { return x >> s }, func(x int, s int64) int { return x >> s }, func(x int, s int32) int { return x >> s }, func(x int, s int16) int { return x >> s }, func(x int, s int8) int { return x >> s }, func(x uint, s int) uint { return x << s }, func(x uint, s int64) uint { return x << s }, func(x uint, s int32) uint { return x << s }, func(x uint, s int16) uint { return x << s }, func(x uint, s int8) uint { return x << s }, func(x uint, s int) uint { return x >> s }, func(x uint, s int64) uint { return x >> s }, func(x uint, s int32) uint { return x >> s }, func(x uint, s int16) uint { return x >> s }, func(x uint, s int8) uint { return x >> s }, } func main() { for _, t := range tests { runTest(reflect.ValueOf(t)) } } func runTest(f reflect.Value) { xt := f.Type().In(0) st := f.Type().In(1) for _, x := range []int{1, 0, -1} { for _, s := range []int{-99, -64, -63, -32, -31, -16, -15, -8, -7, -1, 0, 1, 7, 8, 15, 16, 31, 32, 63, 64, 99} { args := []reflect.Value{ reflect.ValueOf(x).Convert(xt), reflect.ValueOf(s).Convert(st), } if s < 0 { shouldPanic(func() { f.Call(args) }) } else { f.Call(args) // should not panic } } } } func shouldPanic(f func()) { defer func() { if recover() == nil { panic("did not panic") } }() f() }