Home | History | Annotate | Download | only in testdata
      1 // Copyright 2014 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 // This file contains tests for the suspicious shift checker.
      6 
      7 package testdata
      8 
      9 func ShiftTest() {
     10 	var i8 int8
     11 	_ = i8 << 7
     12 	_ = (i8 + 1) << 8 // ERROR "\(i8 \+ 1\) too small for shift of 8"
     13 	_ = i8 << (7 + 1) // ERROR "i8 too small for shift of 8"
     14 	_ = i8 >> 8       // ERROR "i8 too small for shift of 8"
     15 	i8 <<= 8          // ERROR "i8 too small for shift of 8"
     16 	i8 >>= 8          // ERROR "i8 too small for shift of 8"
     17 	var i16 int16
     18 	_ = i16 << 15
     19 	_ = i16 << 16 // ERROR "i16 too small for shift of 16"
     20 	_ = i16 >> 16 // ERROR "i16 too small for shift of 16"
     21 	i16 <<= 16    // ERROR "i16 too small for shift of 16"
     22 	i16 >>= 16    // ERROR "i16 too small for shift of 16"
     23 	var i32 int32
     24 	_ = i32 << 31
     25 	_ = i32 << 32 // ERROR "i32 too small for shift of 32"
     26 	_ = i32 >> 32 // ERROR "i32 too small for shift of 32"
     27 	i32 <<= 32    // ERROR "i32 too small for shift of 32"
     28 	i32 >>= 32    // ERROR "i32 too small for shift of 32"
     29 	var i64 int64
     30 	_ = i64 << 63
     31 	_ = i64 << 64 // ERROR "i64 too small for shift of 64"
     32 	_ = i64 >> 64 // ERROR "i64 too small for shift of 64"
     33 	i64 <<= 64    // ERROR "i64 too small for shift of 64"
     34 	i64 >>= 64    // ERROR "i64 too small for shift of 64"
     35 	var u8 uint8
     36 	_ = u8 << 7
     37 	_ = u8 << 8 // ERROR "u8 too small for shift of 8"
     38 	_ = u8 >> 8 // ERROR "u8 too small for shift of 8"
     39 	u8 <<= 8    // ERROR "u8 too small for shift of 8"
     40 	u8 >>= 8    // ERROR "u8 too small for shift of 8"
     41 	var u16 uint16
     42 	_ = u16 << 15
     43 	_ = u16 << 16 // ERROR "u16 too small for shift of 16"
     44 	_ = u16 >> 16 // ERROR "u16 too small for shift of 16"
     45 	u16 <<= 16    // ERROR "u16 too small for shift of 16"
     46 	u16 >>= 16    // ERROR "u16 too small for shift of 16"
     47 	var u32 uint32
     48 	_ = u32 << 31
     49 	_ = u32 << 32 // ERROR "u32 too small for shift of 32"
     50 	_ = u32 >> 32 // ERROR "u32 too small for shift of 32"
     51 	u32 <<= 32    // ERROR "u32 too small for shift of 32"
     52 	u32 >>= 32    // ERROR "u32 too small for shift of 32"
     53 	var u64 uint64
     54 	_ = u64 << 63
     55 	_ = u64 << 64  // ERROR "u64 too small for shift of 64"
     56 	_ = u64 >> 64  // ERROR "u64 too small for shift of 64"
     57 	u64 <<= 64     // ERROR "u64 too small for shift of 64"
     58 	u64 >>= 64     // ERROR "u64 too small for shift of 64"
     59 	_ = u64 << u64 // Non-constant shifts should succeed.
     60 	var i int
     61 	_ = i << 31
     62 	_ = i << 32 // ERROR "i might be too small for shift of 32"
     63 	_ = i >> 32 // ERROR "i might be too small for shift of 32"
     64 	i <<= 32    // ERROR "i might be too small for shift of 32"
     65 	i >>= 32    // ERROR "i might be too small for shift of 32"
     66 	var u uint
     67 	_ = u << 31
     68 	_ = u << 32 // ERROR "u might be too small for shift of 32"
     69 	_ = u >> 32 // ERROR "u might be too small for shift of 32"
     70 	u <<= 32    // ERROR "u might be too small for shift of 32"
     71 	u >>= 32    // ERROR "u might be too small for shift of 32"
     72 	var p uintptr
     73 	_ = p << 31
     74 	_ = p << 32 // ERROR "p might be too small for shift of 32"
     75 	_ = p >> 32 // ERROR "p might be too small for shift of 32"
     76 	p <<= 32    // ERROR "p might be too small for shift of 32"
     77 	p >>= 32    // ERROR "p might be too small for shift of 32"
     78 
     79 	const oneIf64Bit = ^uint(0) >> 63 // allow large shifts of constants; they are used for 32/64 bit compatibility tricks
     80 }
     81