1
0
mirror of https://github.com/golang/go synced 2024-11-11 20:40:21 -07:00

go/types: fix incorrect string(int) conversion (regression)

The bug was introduced by https://golang.org/cl/220844.

Fixes #42790.

Change-Id: I44d619a1a4d3f2aee1c5575d5cfddcc4ba10895f
Reviewed-on: https://go-review.googlesource.com/c/go/+/272666
Trust: Robert Griesemer <gri@golang.org>
Run-TryBot: Robert Griesemer <gri@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
Robert Griesemer 2020-11-23 15:48:37 -08:00
parent 48a1a51898
commit 762eda346a
2 changed files with 17 additions and 8 deletions

View File

@ -6,7 +6,10 @@
package types package types
import "go/constant" import (
"go/constant"
"unicode"
)
// Conversion type-checks the conversion T(x). // Conversion type-checks the conversion T(x).
// The result is in x. // The result is in x.
@ -21,14 +24,11 @@ func (check *Checker) conversion(x *operand, T Type) {
case representableConst(x.val, check, t, &x.val): case representableConst(x.val, check, t, &x.val):
ok = true ok = true
case isInteger(x.typ) && isString(t): case isInteger(x.typ) && isString(t):
codepoint := int64(-1) codepoint := unicode.ReplacementChar
if i, ok := constant.Int64Val(x.val); ok { if i, ok := constant.Uint64Val(x.val); ok && i <= unicode.MaxRune {
codepoint = i codepoint = rune(i)
} }
// If codepoint < 0 the absolute value is too large (or unknown) for x.val = constant.MakeString(string(codepoint))
// conversion. This is the same as converting any other out-of-range
// value - let string(codepoint) do the work.
x.val = constant.MakeString(string(rune(codepoint)))
ok = true ok = true
} }
case x.convertibleTo(check, T): case x.convertibleTo(check, T):

View File

@ -0,0 +1,9 @@
// compile
// Copyright 2020 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package p
const _ = -uint(len(string(1<<32)) - len("\uFFFD"))