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