blob: 19425868f556e8dcbe03ec095276fd982897cb7e [file] [log] [blame]
// 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)))
}