compiler: Accept out of range integer -> unicode conversions.

When converting a signed or unsigned integer value into a constant
    string, if the integer does not fit into the Go "int" type, the string
    will become "\uFFFD."
    
    Fixes golang/go#11525.
    
    Reviewed-on: https://go-review.googlesource.com/13906

From-SVN: r227395
This commit is contained in:
Ian Lance Taylor 2015-09-02 00:46:23 +00:00
parent ad47aff5c5
commit 3d32e50634
2 changed files with 20 additions and 1 deletions

View File

@ -1,4 +1,4 @@
65672c16004c6d6d0247b6691881d282ffca89e3
a63e173b20baa1a48470dd31a1fb1f2704b37011
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.

View File

@ -3039,6 +3039,25 @@ Type_conversion_expression::do_lower(Gogo*, Named_object*,
}
}
// According to the language specification on string conversions
// (http://golang.org/ref/spec#Conversions_to_and_from_a_string_type):
// When converting an integer into a string, the string will be a UTF-8
// representation of the integer and integers "outside the range of valid
// Unicode code points are converted to '\uFFFD'."
if (type->is_string_type())
{
Numeric_constant nc;
if (val->numeric_constant_value(&nc) && nc.is_int())
{
// An integer value doesn't fit in the Unicode code point range if it
// overflows the Go "int" type or is negative.
unsigned long ul;
if (!nc.set_type(Type::lookup_integer_type("int"), false, location)
|| nc.to_unsigned_long(&ul) == Numeric_constant::NC_UL_NEGATIVE)
return Expression::make_string("\ufffd", location);
}
}
if (type->is_slice_type())
{
Type* element_type = type->array_type()->element_type()->forwarded();