| // 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() | |
| } |