
Previously, the compiler used LLVM's shift instructions directly, which have UB whenever the shifts are large or negative. This commit adds runtime checks for negative shifts, and handles oversized shifts.
118 строки
2,3 КиБ
Go
118 строки
2,3 КиБ
Go
package main
|
|
|
|
func main() {
|
|
println("string equality")
|
|
println(a == "a")
|
|
println(a == "b")
|
|
println(a != "a")
|
|
println(a != "b")
|
|
println("string inequality")
|
|
println(a > "b")
|
|
println("b" > a)
|
|
println("b" > "b")
|
|
println(a <= "b")
|
|
println("b" <= a)
|
|
println("b" <= "b")
|
|
println(a > "b")
|
|
println("b" > a)
|
|
println("b" > "b")
|
|
println(a <= "b")
|
|
println("b" <= a)
|
|
println("b" <= "b")
|
|
println(a < "aa")
|
|
println("aa" < a)
|
|
println("ab" < "aa")
|
|
println("aa" < "ab")
|
|
|
|
println("array equality")
|
|
println(a1 == [2]int{1, 2})
|
|
println(a1 != [2]int{1, 2})
|
|
println(a1 == [2]int{1, 3})
|
|
println(a1 == [2]int{2, 2})
|
|
println(a1 == [2]int{2, 1})
|
|
println(a1 != [2]int{2, 1})
|
|
|
|
println("struct equality")
|
|
println(s1 == Struct1{3, true})
|
|
println(s1 == Struct1{4, true})
|
|
println(s1 == Struct1{3, false})
|
|
println(s1 == Struct1{4, false})
|
|
println(s1 != Struct1{3, true})
|
|
println(s1 != Struct1{4, true})
|
|
println(s1 != Struct1{3, false})
|
|
println(s1 != Struct1{4, false})
|
|
|
|
println("blank fields in structs")
|
|
println(s2 == Struct2{"foo", 0.0, 5})
|
|
println(s2 == Struct2{"foo", 0.0, 7})
|
|
println(s2 == Struct2{"foo", 1.0, 5})
|
|
println(s2 == Struct2{"foo", 1.0, 7})
|
|
|
|
println("complex numbers")
|
|
println(c64 == 3+2i)
|
|
println(c64 == 4+2i)
|
|
println(c64 == 3+3i)
|
|
println(c64 != 3+2i)
|
|
println(c64 != 4+2i)
|
|
println(c64 != 3+3i)
|
|
println(c128 == 3+2i)
|
|
println(c128 == 4+2i)
|
|
println(c128 == 3+3i)
|
|
println(c128 != 3+2i)
|
|
println(c128 != 4+2i)
|
|
println(c128 != 3+3i)
|
|
|
|
println("shifts")
|
|
println(shlSimple == 4)
|
|
println(shlOverflow == 0)
|
|
println(shrSimple == 1)
|
|
println(shrOverflow == 0)
|
|
println(ashrNeg == -1)
|
|
println(ashrOverflow == 0)
|
|
println(ashrNegOverflow == -1)
|
|
}
|
|
|
|
var x = true
|
|
var y = false
|
|
|
|
var a = "a"
|
|
var s1 = Struct1{3, true}
|
|
var s2 = Struct2{"foo", 0.0, 5}
|
|
|
|
var a1 = [2]int{1, 2}
|
|
|
|
var c64 = 3 + 2i
|
|
var c128 = 4 + 3i
|
|
|
|
type Int int
|
|
|
|
type Struct1 struct {
|
|
i Int
|
|
b bool
|
|
}
|
|
|
|
type Struct2 struct {
|
|
s string
|
|
_ float64
|
|
i int
|
|
}
|
|
|
|
func shl(x uint, y uint) uint {
|
|
return x << y
|
|
}
|
|
|
|
func shr(x uint, y uint) uint {
|
|
return x >> y
|
|
}
|
|
|
|
func ashr(x int, y uint) int {
|
|
return x >> y
|
|
}
|
|
|
|
var shlSimple = shl(2, 1)
|
|
var shlOverflow = shl(2, 1000)
|
|
var shrSimple = shr(2, 1)
|
|
var shrOverflow = shr(2, 1000000)
|
|
var ashrNeg = ashr(-1, 1)
|
|
var ashrOverflow = ashr(1, 1000000)
|
|
var ashrNegOverflow = ashr(-1, 1000000)
|