]> Cypherpunks repositories - gostls13.git/commitdiff
reflect: fix Value.Convert for int-to-string conversions (regression)
authorRobert Griesemer <gri@golang.org>
Wed, 25 Nov 2020 21:47:42 +0000 (13:47 -0800)
committerRobert Griesemer <gri@golang.org>
Thu, 26 Nov 2020 05:00:21 +0000 (05:00 +0000)
The bug was introduced by https://golang.org/cl/220844.

Updates #42792.
Fixes #42835.

Change-Id: I03065c7526488aded35ef2f800b7162e1606877a
Reviewed-on: https://go-review.googlesource.com/c/go/+/273326
Trust: Robert Griesemer <gri@golang.org>
Run-TryBot: Robert Griesemer <gri@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/reflect/all_test.go
src/reflect/value.go

index a12712d2540f611968380f9d19320ee2f634b240..b01158635f14167d414421bc4a0573512d74031d 100644 (file)
@@ -4007,9 +4007,12 @@ var convertTests = []struct {
        {V(int16(-3)), V(string("\uFFFD"))},
        {V(int32(-4)), V(string("\uFFFD"))},
        {V(int64(-5)), V(string("\uFFFD"))},
+       {V(int64(-1 << 32)), V(string("\uFFFD"))},
+       {V(int64(1 << 32)), V(string("\uFFFD"))},
        {V(uint(0x110001)), V(string("\uFFFD"))},
        {V(uint32(0x110002)), V(string("\uFFFD"))},
        {V(uint64(0x110003)), V(string("\uFFFD"))},
+       {V(uint64(1 << 32)), V(string("\uFFFD"))},
        {V(uintptr(0x110004)), V(string("\uFFFD"))},
 
        // named string
index bf926a7453bf40648f2bc47d36d3bc6911cb5e29..1f185b52e49e3c73761f584da3a9c71cc269c2f9 100644 (file)
@@ -2681,12 +2681,20 @@ func cvtComplex(v Value, t Type) Value {
 
 // convertOp: intXX -> string
 func cvtIntString(v Value, t Type) Value {
-       return makeString(v.flag.ro(), string(rune(v.Int())), t)
+       s := "\uFFFD"
+       if x := v.Int(); int64(rune(x)) == x {
+               s = string(rune(x))
+       }
+       return makeString(v.flag.ro(), s, t)
 }
 
 // convertOp: uintXX -> string
 func cvtUintString(v Value, t Type) Value {
-       return makeString(v.flag.ro(), string(rune(v.Uint())), t)
+       s := "\uFFFD"
+       if x := v.Uint(); uint64(rune(x)) == x {
+               s = string(rune(x))
+       }
+       return makeString(v.flag.ro(), s, t)
 }
 
 // convertOp: []byte -> string