package types2
-import "go/constant"
+import (
+ "go/constant"
+ "unicode"
+)
// Conversion type-checks the conversion T(x).
// The result is in x.
case representableConst(x.val, check, t, &x.val):
ok = true
case isInteger(x.typ) && isString(t):
- codepoint := int64(-1)
- if i, ok := constant.Int64Val(x.val); ok {
- codepoint = i
+ codepoint := unicode.ReplacementChar
+ if i, ok := constant.Uint64Val(x.val); ok && i <= unicode.MaxRune {
+ codepoint = rune(i)
}
- // If codepoint < 0 the absolute value is too large (or unknown) for
- // 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)))
+ x.val = constant.MakeString(string(codepoint))
ok = true
}
case x.convertibleTo(check, T):
package types
-import "go/constant"
+import (
+ "go/constant"
+ "unicode"
+)
// Conversion type-checks the conversion T(x).
// The result is in x.
case representableConst(x.val, check, t, &x.val):
ok = true
case isInteger(x.typ) && isString(t):
- codepoint := int64(-1)
- if i, ok := constant.Int64Val(x.val); ok {
- codepoint = i
+ codepoint := unicode.ReplacementChar
+ if i, ok := constant.Uint64Val(x.val); ok && i <= unicode.MaxRune {
+ codepoint = rune(i)
}
- // If codepoint < 0 the absolute value is too large (or unknown) for
- // 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)))
+ x.val = constant.MakeString(string(codepoint))
ok = true
}
case x.convertibleTo(check, T):