Commit 2b5360d7 by Ian Lance Taylor

compiler: handle int-to-string conversion with large integer constant

    
    Currently, Type_conversion_expression::do_is_constant thinks the
    int-to-string conversion is constant if the integer operand is
    constant, but Type_conversion_expression::do_get_backend actually
    generates a call to runtime.intstring if the integer does not fit
    in a "ushort", which makes it not suitable in constant context,
    such as static initializer.
    
    This CL makes it handle all constant integer input as constant,
    generating constant string.
    
    Fixes golang/go#32347.
    
    Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/179777

From-SVN: r271821
parent f2c2c4e3
8402f6ac021ba20163ab4fcdb10ab7bb642de6dc e521123b23494148d534755e2f3d7806b42c96ad
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.
...@@ -3842,11 +3842,20 @@ Type_conversion_expression::do_get_backend(Translate_context* context) ...@@ -3842,11 +3842,20 @@ Type_conversion_expression::do_get_backend(Translate_context* context)
mpz_t intval; mpz_t intval;
Numeric_constant nc; Numeric_constant nc;
if (this->expr_->numeric_constant_value(&nc) if (this->expr_->numeric_constant_value(&nc)
&& nc.to_int(&intval) && nc.to_int(&intval))
&& mpz_fits_ushort_p(intval))
{ {
std::string s; std::string s;
Lex::append_char(mpz_get_ui(intval), true, &s, loc); unsigned int x;
if (mpz_fits_uint_p(intval))
x = mpz_get_ui(intval);
else
{
char* s = mpz_get_str(NULL, 16, intval);
go_warning_at(loc, 0,
"unicode code point 0x%s out of range in string", s);
x = 0xfffd;
}
Lex::append_char(x, true, &s, loc);
mpz_clear(intval); mpz_clear(intval);
Expression* se = Expression::make_string(s, loc); Expression* se = Expression::make_string(s, loc);
return se->get_backend(context); return se->get_backend(context);
......
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