| // RUN: llgo -o %t %s |
| // RUN: %t 2>&1 | FileCheck %s |
| |
| // CHECK: 4096 |
| // CHECK-NEXT: 256 |
| // CHECK-NEXT: 0 |
| // CHECK-NEXT: 0 |
| // CHECK-NEXT: 4096 |
| // CHECK-NEXT: 256 |
| // CHECK-NEXT: 0 |
| // CHECK-NEXT: 0 |
| // CHECK-NEXT: 65280 |
| // CHECK-NEXT: 0 |
| // CHECK-NEXT: 0 |
| // CHECK-NEXT: 0 |
| // CHECK-NEXT: 61184 |
| // CHECK-NEXT: 65024 |
| // CHECK-NEXT: 65296 |
| // CHECK-NEXT: 65281 |
| // CHECK-NEXT: 61184 |
| // CHECK-NEXT: 65024 |
| // CHECK-NEXT: 65296 |
| // CHECK-NEXT: 65281 |
| // CHECK-NEXT: -62 |
| // CHECK-NEXT: -246 |
| // CHECK-NEXT: +1.224560e+002 |
| // CHECK-NEXT: 3 |
| // CHECK-NEXT: 3 |
| // CHECK-NEXT: 4 |
| // CHECK-NEXT: 122 |
| // CHECK-NEXT: -124 |
| // CHECK-NEXT: 120 |
| // CHECK-NEXT: 18446744073709547520 |
| // CHECK-NEXT: false |
| // CHECK-NEXT: 2147483648 |
| // CHECK-NEXT: 9223372036854775808 |
| // CHECK-NEXT: 2147483648 2147483648 |
| // CHECK-NEXT: 9223372036854775808 9223372036854775808 |
| |
| package main |
| |
| import "unsafe" |
| |
| var global string |
| |
| var hi = 0xFF00 |
| var lo = 0xFF00 |
| |
| // borrowed from math package to avoid dependency on standard library |
| func float32bits(f float32) uint32 { return *(*uint32)(unsafe.Pointer(&f)) } |
| func float64bits(f float64) uint64 { return *(*uint64)(unsafe.Pointer(&f)) } |
| |
| func main() { |
| println(hi & 0x1000) |
| println(hi & 0x0100) |
| println(hi & 0x0010) |
| println(hi & 0x0001) |
| println(lo & 0x1000) |
| println(lo & 0x0100) |
| println(lo & 0x0010) |
| println(lo & 0x0001) |
| println(hi | lo) |
| println(hi ^ hi) |
| println(hi ^ lo) |
| println(lo ^ lo) |
| println(hi ^ 0x1000) |
| println(hi ^ 0x0100) |
| println(hi ^ 0x0010) |
| println(hi ^ 0x0001) |
| println(lo ^ 0x1000) |
| println(lo ^ 0x0100) |
| println(lo ^ 0x0010) |
| println(lo ^ 0x0001) |
| println(-123 >> 1) |
| println(-123 << 1) |
| |
| var f float64 = 123.456 |
| f-- |
| println(f) |
| |
| // context of '&' op is used to type the untyped lhs |
| // operand of the shift expression. |
| shift := uint(2) |
| println(uint64(0xFFFFFFFF) & (1<<shift - 1)) |
| println((1<<shift - 1) & uint64(0xFFFFFFFF)) |
| |
| // rhs' type is converted lhs' |
| println(uint32(1) << uint64(2)) |
| { |
| var _uint64 uint64 |
| var _uint uint |
| x := _uint64 >> (63 - _uint) |
| if x == 2<<_uint { |
| println("!") |
| } |
| } |
| |
| // There was a bug related to compound expressions involving |
| // multiple binary logical operators. |
| var a, b, c int |
| if a == 0 && (b != 0 || c != 0) { |
| println("!") |
| } |
| |
| var si int = -123 |
| var ui int = 123 |
| println(^si) |
| println(^ui) |
| println(ui &^ 3) |
| |
| // test case from math/modf.go |
| var x uint64 = 0xFFFFFFFFFFFFFFFF |
| var e uint = 40 |
| x &^= 1<<(64-12-e) - 1 |
| println(x) |
| |
| // compare global to non-global |
| println(new(string) == &global) |
| |
| // negative zero |
| var f32 float32 |
| var f64 float64 |
| var c64 complex64 |
| var c128 complex128 |
| f32 = -f32 |
| f64 = -f64 |
| c64 = -c64 |
| c128 = -c128 |
| println(float32bits(f32)) |
| println(float64bits(f64)) |
| println(float32bits(real(c64)), float32bits(imag(c64))) |
| println(float64bits(real(c128)), float64bits(imag(c128))) |
| } |