Commit 3d32e506 by Ian Lance Taylor

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
parent ad47aff5
65672c16004c6d6d0247b6691881d282ffca89e3 a63e173b20baa1a48470dd31a1fb1f2704b37011
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -3039,6 +3039,25 @@ Type_conversion_expression::do_lower(Gogo*, Named_object*, ...@@ -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()) if (type->is_slice_type())
{ {
Type* element_type = type->array_type()->element_type()->forwarded(); Type* element_type = type->array_type()->element_type()->forwarded();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment