Fix cross-type decoding of numbers. Fixes #1245752. R= CC= https://codereview.appspot.com/22600044
diff --git a/decode.go b/decode.go index 5dd2ce5..6586be4 100644 --- a/decode.go +++ b/decode.go
@@ -315,6 +315,11 @@ out.SetInt(resolved) good = true } + case float64: + if resolved < 1<<63-1 && !out.OverflowInt(int64(resolved)) { + out.SetInt(int64(resolved)) + good = true + } } case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: switch resolved := resolved.(type) { @@ -328,6 +333,11 @@ out.SetUint(uint64(resolved)) good = true } + case float64: + if resolved < 1<<64-1 && !out.OverflowUint(uint64(resolved)) { + out.SetUint(uint64(resolved)) + good = true + } } case reflect.Bool: switch resolved := resolved.(type) { @@ -337,6 +347,12 @@ } case reflect.Float32, reflect.Float64: switch resolved := resolved.(type) { + case int: + out.SetFloat(float64(resolved)) + good = true + case int64: + out.SetFloat(float64(resolved)) + good = true case float64: out.SetFloat(resolved) good = true
diff --git a/decode_test.go b/decode_test.go index 9b2a263..5d12196 100644 --- a/decode_test.go +++ b/decode_test.go
@@ -224,6 +224,15 @@ "a: 1", &struct{ A int }{1}, }, { + "a: 1", + &struct{ A float64 }{1}, + }, { + "a: 1.0", + &struct{ A int }{1}, + }, { + "a: 1.0", + &struct{ A uint }{1}, + }, { "a: [1, 2]", &struct{ A []int }{[]int{1, 2}}, }, {