mirror of
https://github.com/autc04/Retro68.git
synced 2024-11-03 07:07:20 +00:00
163 lines
4.6 KiB
Go
163 lines
4.6 KiB
Go
// Copyright 2014 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.
|
|
|
|
// This file contains tests for the suspicious shift checker.
|
|
|
|
package testdata
|
|
|
|
import (
|
|
"fmt"
|
|
"unsafe"
|
|
)
|
|
|
|
func ShiftTest() {
|
|
var i8 int8
|
|
_ = i8 << 7
|
|
_ = (i8 + 1) << 8 // ERROR ".i8 . 1. .8 bits. too small for shift of 8"
|
|
_ = i8 << (7 + 1) // ERROR "i8 .8 bits. too small for shift of 8"
|
|
_ = i8 >> 8 // ERROR "i8 .8 bits. too small for shift of 8"
|
|
i8 <<= 8 // ERROR "i8 .8 bits. too small for shift of 8"
|
|
i8 >>= 8 // ERROR "i8 .8 bits. too small for shift of 8"
|
|
var i16 int16
|
|
_ = i16 << 15
|
|
_ = i16 << 16 // ERROR "i16 .16 bits. too small for shift of 16"
|
|
_ = i16 >> 16 // ERROR "i16 .16 bits. too small for shift of 16"
|
|
i16 <<= 16 // ERROR "i16 .16 bits. too small for shift of 16"
|
|
i16 >>= 16 // ERROR "i16 .16 bits. too small for shift of 16"
|
|
var i32 int32
|
|
_ = i32 << 31
|
|
_ = i32 << 32 // ERROR "i32 .32 bits. too small for shift of 32"
|
|
_ = i32 >> 32 // ERROR "i32 .32 bits. too small for shift of 32"
|
|
i32 <<= 32 // ERROR "i32 .32 bits. too small for shift of 32"
|
|
i32 >>= 32 // ERROR "i32 .32 bits. too small for shift of 32"
|
|
var i64 int64
|
|
_ = i64 << 63
|
|
_ = i64 << 64 // ERROR "i64 .64 bits. too small for shift of 64"
|
|
_ = i64 >> 64 // ERROR "i64 .64 bits. too small for shift of 64"
|
|
i64 <<= 64 // ERROR "i64 .64 bits. too small for shift of 64"
|
|
i64 >>= 64 // ERROR "i64 .64 bits. too small for shift of 64"
|
|
var u8 uint8
|
|
_ = u8 << 7
|
|
_ = u8 << 8 // ERROR "u8 .8 bits. too small for shift of 8"
|
|
_ = u8 >> 8 // ERROR "u8 .8 bits. too small for shift of 8"
|
|
u8 <<= 8 // ERROR "u8 .8 bits. too small for shift of 8"
|
|
u8 >>= 8 // ERROR "u8 .8 bits. too small for shift of 8"
|
|
var u16 uint16
|
|
_ = u16 << 15
|
|
_ = u16 << 16 // ERROR "u16 .16 bits. too small for shift of 16"
|
|
_ = u16 >> 16 // ERROR "u16 .16 bits. too small for shift of 16"
|
|
u16 <<= 16 // ERROR "u16 .16 bits. too small for shift of 16"
|
|
u16 >>= 16 // ERROR "u16 .16 bits. too small for shift of 16"
|
|
var u32 uint32
|
|
_ = u32 << 31
|
|
_ = u32 << 32 // ERROR "u32 .32 bits. too small for shift of 32"
|
|
_ = u32 >> 32 // ERROR "u32 .32 bits. too small for shift of 32"
|
|
u32 <<= 32 // ERROR "u32 .32 bits. too small for shift of 32"
|
|
u32 >>= 32 // ERROR "u32 .32 bits. too small for shift of 32"
|
|
var u64 uint64
|
|
_ = u64 << 63
|
|
_ = u64 << 64 // ERROR "u64 .64 bits. too small for shift of 64"
|
|
_ = u64 >> 64 // ERROR "u64 .64 bits. too small for shift of 64"
|
|
u64 <<= 64 // ERROR "u64 .64 bits. too small for shift of 64"
|
|
u64 >>= 64 // ERROR "u64 .64 bits. too small for shift of 64"
|
|
_ = u64 << u64 // Non-constant shifts should succeed.
|
|
|
|
var i int
|
|
_ = i << 31
|
|
const in = 8 * unsafe.Sizeof(i)
|
|
_ = i << in // ERROR "too small for shift"
|
|
_ = i >> in // ERROR "too small for shift"
|
|
i <<= in // ERROR "too small for shift"
|
|
i >>= in // ERROR "too small for shift"
|
|
const ix = 8*unsafe.Sizeof(i) - 1
|
|
_ = i << ix
|
|
_ = i >> ix
|
|
i <<= ix
|
|
i >>= ix
|
|
|
|
var u uint
|
|
_ = u << 31
|
|
const un = 8 * unsafe.Sizeof(u)
|
|
_ = u << un // ERROR "too small for shift"
|
|
_ = u >> un // ERROR "too small for shift"
|
|
u <<= un // ERROR "too small for shift"
|
|
u >>= un // ERROR "too small for shift"
|
|
const ux = 8*unsafe.Sizeof(u) - 1
|
|
_ = u << ux
|
|
_ = u >> ux
|
|
u <<= ux
|
|
u >>= ux
|
|
|
|
var p uintptr
|
|
_ = p << 31
|
|
const pn = 8 * unsafe.Sizeof(p)
|
|
_ = p << pn // ERROR "too small for shift"
|
|
_ = p >> pn // ERROR "too small for shift"
|
|
p <<= pn // ERROR "too small for shift"
|
|
p >>= pn // ERROR "too small for shift"
|
|
const px = 8*unsafe.Sizeof(p) - 1
|
|
_ = p << px
|
|
_ = p >> px
|
|
p <<= px
|
|
p >>= px
|
|
|
|
const oneIf64Bit = ^uint(0) >> 63 // allow large shifts of constants; they are used for 32/64 bit compatibility tricks
|
|
|
|
var h uintptr
|
|
h = h<<8 | (h >> (8 * (unsafe.Sizeof(h) - 1)))
|
|
h <<= 8 * unsafe.Sizeof(h) // ERROR "too small for shift"
|
|
h >>= 7 * unsafe.Alignof(h)
|
|
h >>= 8 * unsafe.Alignof(h) // ERROR "too small for shift"
|
|
}
|
|
|
|
func ShiftDeadCode() {
|
|
var i int
|
|
const iBits = 8 * unsafe.Sizeof(i)
|
|
|
|
if iBits <= 32 {
|
|
if iBits == 16 {
|
|
_ = i >> 8
|
|
} else {
|
|
_ = i >> 16
|
|
}
|
|
} else {
|
|
_ = i >> 32
|
|
}
|
|
|
|
if iBits >= 64 {
|
|
_ = i << 32
|
|
if iBits == 128 {
|
|
_ = i << 64
|
|
}
|
|
} else {
|
|
_ = i << 16
|
|
}
|
|
|
|
if iBits == 64 {
|
|
_ = i << 32
|
|
}
|
|
|
|
switch iBits {
|
|
case 128, 64:
|
|
_ = i << 32
|
|
default:
|
|
_ = i << 16
|
|
}
|
|
|
|
switch {
|
|
case iBits < 32:
|
|
_ = i << 16
|
|
case iBits > 64:
|
|
_ = i << 64
|
|
default:
|
|
_ = i << 64 // ERROR "too small for shift"
|
|
}
|
|
|
|
// Make sure other vet checks work in dead code.
|
|
if iBits == 1024 {
|
|
_ = i << 512 // OK
|
|
fmt.Printf("foo %s bar", 123) // ERROR "Printf"
|
|
}
|
|
}
|