go shifts 源码

  • 2022-07-15
  • 浏览 (1248)

golang shifts 代码

文件路径:/src/cmd/compile/internal/types2/testdata/check/shifts.go

// Copyright 2013 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 shifts

func shifts0() {
	// basic constant shifts
	const (
		s = 10
		_ = 0<<0
		_ = 1<<s
		_ = 1<<- /* ERROR "negative shift count" */ 1
		// For the test below we may decide to convert to int
		// rather than uint and then report a negative shift
		// count instead, which might be a better error. The
		// (minor) difference is that this would restrict the
		// shift count range by half (from all uint values to
		// the positive int values).
		// This depends on the exact spec wording which is not
		// done yet.
		// TODO(gri) revisit and adjust when spec change is done
		_ = 1<<- /* ERROR "negative shift count" */ 1.0
		_ = 1<<1075 /* ERROR "invalid shift" */
		_ = 2.0<<1
		_ = 1<<1.0
		_ = 1<<(1+0i)

		_ int = 2<<s
		_ float32 = 2<<s
		_ complex64 = 2<<s

		_ int = 2.0<<s
		_ float32 = 2.0<<s
		_ complex64 = 2.0<<s

		_ int = 'a'<<s
		_ float32 = 'a'<<s
		_ complex64 = 'a'<<s
	)
}

func shifts1() {
	// basic non-constant shifts
	var (
		i int
		u uint

		_ = 1<<0
		_ = 1<<i
		_ = 1<<u
		_ = 1<<"foo" /* ERROR "cannot convert" */
		_ = i<<0
		_ = i<<- /* ERROR "negative shift count" */ 1
		_ = i<<1.0
		_ = 1<<(1+0i)
		_ = 1 /* ERROR "overflows" */ <<100

		_ uint = 1 << 0
		_ uint = 1 << u
		_ float32 = 1 /* ERROR "must be integer" */ << u

		// issue #14822
		_ = 1<<( /* ERROR "overflows uint" */ 1<<64)
		_ = 1<<( /* ERROR "invalid shift count" */ 1<<64-1)

		// issue #43697
		_ = u<<( /* ERROR "overflows uint" */ 1<<64)
		_ = u<<(1<<64-1)
	)
}

func shifts2() {
	// from the spec
	var (
		s uint = 33
		i = 1<<s           // 1 has type int
		j int32 = 1<<s     // 1 has type int32; j == 0
		k = uint64(1<<s)   // 1 has type uint64; k == 1<<33
		m int = 1.0<<s     // 1.0 has type int
		n = 1.0<<s != i    // 1.0 has type int; n == false if ints are 32bits in size
		o = 1<<s == 2<<s   // 1 and 2 have type int; o == true if ints are 32bits in size
		p = 1<<s == 1<<33  // illegal if ints are 32bits in size: 1 has type int, but 1<<33 overflows int
		u = 1.0 /* ERROR "must be integer" */ <<s         // illegal: 1.0 has type float64, cannot shift
		u1 = 1.0 /* ERROR "must be integer" */ <<s != 0   // illegal: 1.0 has type float64, cannot shift
		u2 = 1 /* ERROR "must be integer" */ <<s != 1.0   // illegal: 1 has type float64, cannot shift
		v float32 = 1 /* ERROR "must be integer" */ <<s   // illegal: 1 has type float32, cannot shift
		w int64 = 1.0<<33  // 1.0<<33 is a constant shift expression
	)
	_, _, _, _, _, _, _, _, _, _, _, _ = i, j, k, m, n, o, p, u, u1, u2, v, w
}

func shifts3(a int16, b float32) {
	// random tests
	var (
		s uint = 11
		u = 1 /* ERROR "must be integer" */ <<s + 1.0
		v complex128 = 1 /* ERROR "must be integer" */ << s + 1.0 /* ERROR "must be integer" */ << s + 1
	)
	x := 1.0 /* ERROR "must be integer" */ <<s + 1
	shifts3(1.0 << s, 1 /* ERROR "must be integer" */ >> s)
	_, _, _ = u, v, x
}

func shifts4() {
	// shifts in comparisons w/ untyped operands
	var s uint

	_ = 1<<s == 1
	_ = 1 /* ERROR "integer" */ <<s == 1.
	_ = 1. /* ERROR "integer" */ <<s == 1
	_ = 1. /* ERROR "integer" */ <<s == 1.

	_ = 1<<s + 1 == 1
	_ = 1 /* ERROR "integer" */ <<s + 1 == 1.
	_ = 1 /* ERROR "integer" */ <<s + 1. == 1
	_ = 1 /* ERROR "integer" */ <<s + 1. == 1.
	_ = 1. /* ERROR "integer" */ <<s + 1 == 1
	_ = 1. /* ERROR "integer" */ <<s + 1 == 1.
	_ = 1. /* ERROR "integer" */ <<s + 1. == 1
	_ = 1. /* ERROR "integer" */ <<s + 1. == 1.

	_ = 1<<s == 1<<s
	_ = 1 /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s
	_ = 1. /* ERROR "integer" */ <<s == 1 /* ERROR "integer" */ <<s
	_ = 1. /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s

	_ = 1<<s + 1<<s == 1
	_ = 1 /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1.
	_ = 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1
	_ = 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1.
	_ = 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1
	_ = 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1.
	_ = 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1
	_ = 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1.

	_ = 1<<s + 1<<s == 1<<s + 1<<s
	_ = 1 /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s
	_ = 1 /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s
	_ = 1 /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s
	_ = 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1 /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s
	_ = 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s
	_ = 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s
	_ = 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s
	_ = 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1 /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s
	_ = 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s
	_ = 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s
	_ = 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s
	_ = 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1 /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s
	_ = 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1 /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s
	_ = 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s + 1 /* ERROR "integer" */ <<s
	_ = 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s == 1. /* ERROR "integer" */ <<s + 1. /* ERROR "integer" */ <<s
}

func shifts5() {
	// shifts in comparisons w/ typed operands
	var s uint
	var x int

	_ = 1<<s == x
	_ = 1.<<s == x
	_ = 1.1 /* ERROR "int" */ <<s == x

	_ = 1<<s + x == 1
	_ = 1<<s + x == 1.
	_ = 1<<s + x == 1.1 /* ERROR "int" */
	_ = 1.<<s + x == 1
	_ = 1.<<s + x == 1.
	_ = 1.<<s + x == 1.1 /* ERROR "int" */
	_ = 1.1 /* ERROR "int" */ <<s + x == 1
	_ = 1.1 /* ERROR "int" */ <<s + x == 1.
	_ = 1.1 /* ERROR "int" */ <<s + x == 1.1

	_ = 1<<s == x<<s
	_ = 1.<<s == x<<s
	_ = 1.1  /* ERROR "int" */ <<s == x<<s
}

func shifts6() {
	// shifts as operands in non-arithmetic operations and as arguments
	var a [10]int
	var s uint

	_ = a[1<<s]
	_ = a[1.0]
	_ = a[1.0<<s]

	_ = make([]int, 1.0)
	_ = make([]int, 1.0<<s)
	_ = make([]int, 1.1 /* ERROR "must be integer" */ <<s)

	_ = float32(1)
	_ = float32(1 /* ERROR "must be integer" */ <<s)
	_ = float32(1.0)
	_ = float32(1.0 /* ERROR "must be integer" */ <<s)
	_ = float32(1.1 /* ERROR "must be integer" */ <<s)

	// TODO(gri) port fixes from go/types
	// _ = int32(0x80000000 /* ERROR "overflows int32" */ << s)
	// TODO(rfindley) Eliminate the redundant error here.
	// _ = int32(( /* ERROR "truncated to int32" */ 0x80000000 /* ERROR "truncated to int32" */ + 0i) << s)

	_ = int(1+0i<<0)
	// _ = int((1+0i)<<s)
	// _ = int(1.0<<s)
	// _ = int(complex(1, 0)<<s)
	_ = int(float32/* ERROR "must be integer" */(1.0) <<s)
	_ = int(1.1 /* ERROR must be integer */ <<s)
	_ = int(( /* ERROR "must be integer" */ 1+1i)  <<s)

	_ = complex(1 /* ERROR "must be integer" */ <<s, 0)

	var b []int
	_ = append(b, 1<<s)
	_ = append(b, 1.0<<s)
	_ = append(b, (1+0i)<<s)
	_ = append(b, 1.1 /* ERROR "must be integer" */ <<s)
	_ = append(b, (1 + 0i) <<s)
	_ = append(b, ( /* ERROR "must be integer" */ 1 + 1i)  <<s)

	_ = complex(1.0 /* ERROR "must be integer" */ <<s, 0)
	_ = complex(1.1 /* ERROR "must be integer" */ <<s, 0)
	_ = complex(0, 1.0 /* ERROR "must be integer" */ <<s)
	_ = complex(0, 1.1 /* ERROR "must be integer" */ <<s)

	// TODO(gri) The delete below is not type-checked correctly yet.
	// var m1 map[int]string
	// delete(m1, 1<<s)
}

func shifts7() {
	// shifts of shifts
	var s uint
	var x int
	_ = x

	_ = 1<<(1<<s)
	_ = 1<<(1.<<s)
	_ = 1. /* ERROR "integer" */ <<(1<<s)
	_ = 1. /* ERROR "integer" */ <<(1.<<s)

	x = 1<<(1<<s)
	x = 1<<(1.<<s)
	x = 1.<<(1<<s)
	x = 1.<<(1.<<s)

	_ = (1<<s)<<(1<<s)
	_ = (1<<s)<<(1.<<s)
	_ = ( /* ERROR "integer" */ 1.<<s)<<(1<<s)
	_ = ( /* ERROR "integer" */ 1.<<s)<<(1.<<s)

	x = (1<<s)<<(1<<s)
	x = (1<<s)<<(1.<<s)
	x = ( /* ERROR "integer" */ 1.<<s)<<(1<<s)
	x = ( /* ERROR "integer" */ 1.<<s)<<(1.<<s)
}

func shifts8() {
	// shift examples from shift discussion: better error messages
	var s uint
	_ = 1.0 /* ERROR "shifted operand 1.0 \(type float64\) must be integer" */ <<s == 1
	_ = 1.0 /* ERROR "shifted operand 1.0 \(type float64\) must be integer" */ <<s == 1.0
	_ = 1 /* ERROR "shifted operand 1 \(type float64\) must be integer" */ <<s == 1.0
	_ = 1 /* ERROR "shifted operand 1 \(type float64\) must be integer" */ <<s + 1.0 == 1
	_ = 1 /* ERROR "shifted operand 1 \(type float64\) must be integer" */ <<s + 1.1 == 1
	_ = 1 /* ERROR "shifted operand 1 \(type float64\) must be integer" */ <<s + 1 == 1.0

	// additional cases
	_ = complex(1.0 /* ERROR "shifted operand 1.0 \(type float64\) must be integer" */ <<s, 1)
	_ = complex(1.0, 1 /* ERROR "shifted operand 1 \(type float64\) must be integer" */ <<s)

	_ = int(1.<<s)
	_ = int(1.1 /* ERROR "shifted operand .* must be integer" */ <<s)
	_ = float32(1 /* ERROR "shifted operand .* must be integer" */ <<s)
	_ = float32(1. /* ERROR "shifted operand .* must be integer" */ <<s)
	_ = float32(1.1 /* ERROR "shifted operand .* must be integer" */ <<s)
	// TODO(gri) the error messages for these two are incorrect - disabled for now
	// _ = complex64(1<<s)
	// _ = complex64(1.<<s)
	_ = complex64(1.1 /* ERROR "shifted operand .* must be integer" */ <<s)
}

func shifts9() {
	// various originally failing snippets of code from the std library
	// from src/compress/lzw/reader.go:90
	{
		var d struct {
			bits     uint32
			width    uint
		}
		_ = uint16(d.bits & (1<<d.width - 1))
	}

	// from src/debug/dwarf/buf.go:116
	{
		var ux uint64
		var bits uint
		x := int64(ux)
		if x&(1<<(bits-1)) != 0 {}
	}

	// from src/encoding/asn1/asn1.go:160
	{
		var bytes []byte
		if bytes[len(bytes)-1]&((1<<bytes[0])-1) != 0 {}
	}

	// from src/math/big/rat.go:140
	{
		var exp int
		var mantissa uint64
		shift := uint64(-1022 - (exp - 1)) // [1..53)
		_ = mantissa & (1<<shift - 1)
	}

	// from src/net/interface.go:51
	{
		type Flags uint
		var f Flags
		var i int
		if f&(1<<uint(i)) != 0 {}
	}

	// from src/runtime/softfloat64.go:234
	{
		var gm uint64
		var shift uint
		_ = gm & (1<<shift - 1)
	}

	// from src/strconv/atof.go:326
	{
		var mant uint64
		var mantbits uint
		if mant == 2<<mantbits {}
	}

	// from src/route_bsd.go:82
	{
		var Addrs int32
		const rtaRtMask = 1
		var i uint
		if Addrs&rtaRtMask&(1<<i) == 0 {}
	}

	// from src/text/scanner/scanner.go:540
	{
		var s struct { Whitespace uint64 }
		var ch rune
		for s.Whitespace&(1<<uint(ch)) != 0 {}
	}
}

func issue5895() {
	var x = 'a' << 1 // type of x must be rune
	var _ rune = x
}

func issue11325() {
	var _ = 0 >> 1.1 /* ERROR "truncated to uint" */ // example from issue 11325
	_ = 0 >> 1.1 /* ERROR "truncated to uint" */
	_ = 0 << 1.1 /* ERROR "truncated to uint" */
	_ = 0 >> 1.
	_ = 1 >> 1.1 /* ERROR "truncated to uint" */
	_ = 1 >> 1.
	_ = 1. >> 1
	_ = 1. >> 1.
	_ = 1.1 /* ERROR "must be integer" */ >> 1
}

func issue11594() {
	var _ = complex64 /* ERROR "must be integer" */ (1) << 2 // example from issue 11594
	_ = float32 /* ERROR "must be integer" */ (0) << 1
	_ = float64 /* ERROR "must be integer" */ (0) >> 2
	_ = complex64 /* ERROR "must be integer" */ (0) << 3
	_ = complex64 /* ERROR "must be integer" */ (0) >> 4
}

func issue21727() {
	var s uint
	var a = make([]int, 1<<s + 1.2 /* ERROR "truncated to int" */ )
	var _ = a[1<<s - 2.3 /* ERROR "truncated to int" */ ]
	var _ int = 1<<s + 3.4 /* ERROR "truncated to int" */
	var _ = string(1 /* ERROR shifted operand 1 .* must be integer */ << s)
	var _ = string(1.0 /* ERROR "cannot convert" */ << s)
}

func issue22969() {
	var s uint
	var a []byte
	_ = a[0xffffffffffffffff /* ERROR "overflows int" */ <<s] // example from issue 22969
	_ = make([]int, 0xffffffffffffffff /* ERROR "overflows int" */ << s)
	_ = make([]int, 0, 0xffffffffffffffff /* ERROR "overflows int" */ << s)
	var _ byte = 0x100 /* ERROR "overflows byte" */ << s
	var _ int8 = 0xff /* ERROR "overflows int8" */ << s
	var _ int16 = 0xffff /* ERROR "overflows int16" */ << s
	var _ int32 = 0x80000000 /* ERROR "overflows int32" */ << s
}

相关信息

go 源码目录

相关文章

go blank 源码

go builtins0 源码

go builtins1 源码

go chans 源码

go compliterals 源码

go const0 源码

go const1 源码

go constdecl 源码

go conversions0 源码

go conversions1 源码

0  赞