Commit 38070a72 authored by Rémy Oudompheng's avatar Rémy Oudompheng

reflect: stop thinking that MaxFloat32 overflows float32.

Fixes #4282.

R=golang-dev, minux.ma, rsc
CC=golang-dev
https://golang.org/cl/6759052
parent 320df44f
......@@ -2664,6 +2664,45 @@ func TestConvert(t *testing.T) {
}
}
func TestOverflow(t *testing.T) {
if ovf := V(float64(0)).OverflowFloat(1e300); ovf {
t.Errorf("%v wrongly overflows float64", 1e300)
}
maxFloat32 := float64((1<<24 - 1) << (127 - 23))
if ovf := V(float32(0)).OverflowFloat(maxFloat32); ovf {
t.Errorf("%v wrongly overflows float32", maxFloat32)
}
ovfFloat32 := float64((1<<24-1)<<(127-23) + 1<<(127-52))
if ovf := V(float32(0)).OverflowFloat(ovfFloat32); !ovf {
t.Errorf("%v should overflow float32", ovfFloat32)
}
if ovf := V(float32(0)).OverflowFloat(-ovfFloat32); !ovf {
t.Errorf("%v should overflow float32", -ovfFloat32)
}
maxInt32 := int64(0x7fffffff)
if ovf := V(int32(0)).OverflowInt(maxInt32); ovf {
t.Errorf("%v wrongly overflows int32", maxInt32)
}
if ovf := V(int32(0)).OverflowInt(-1 << 31); ovf {
t.Errorf("%v wrongly overflows int32", -int64(1)<<31)
}
ovfInt32 := int64(1 << 31)
if ovf := V(int32(0)).OverflowInt(ovfInt32); !ovf {
t.Errorf("%v should overflow int32", ovfInt32)
}
maxUint32 := uint64(0xffffffff)
if ovf := V(uint32(0)).OverflowUint(maxUint32); ovf {
t.Errorf("%v wrongly overflows uint32", maxUint32)
}
ovfUint32 := uint64(1 << 32)
if ovf := V(uint32(0)).OverflowUint(ovfUint32); !ovf {
t.Errorf("%v should overflow uint32", ovfUint32)
}
}
type B1 struct {
X int
Y int
......
......@@ -1179,7 +1179,7 @@ func overflowFloat32(x float64) bool {
if x < 0 {
x = -x
}
return math.MaxFloat32 <= x && x <= math.MaxFloat64
return math.MaxFloat32 < x && x <= math.MaxFloat64
}
// OverflowInt returns true if the int64 x cannot be represented by v's type.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment