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}},
}, {