From 2b5360d7477277e7e0f32a5bd5479afac819b5e1 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Fri, 31 May 2019 19:45:37 +0000 Subject: [PATCH] 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 --- gcc/go/gofrontend/MERGE | 2 +- gcc/go/gofrontend/expressions.cc | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index 72268229fbc..420248b6262 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -8402f6ac021ba20163ab4fcdb10ab7bb642de6dc +e521123b23494148d534755e2f3d7806b42c96ad The first line of this file holds the git revision number of the last merge done from the gofrontend repository. diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc index e3a662736a0..f0c12f42ce3 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -3842,11 +3842,20 @@ Type_conversion_expression::do_get_backend(Translate_context* context) mpz_t intval; Numeric_constant nc; if (this->expr_->numeric_constant_value(&nc) - && nc.to_int(&intval) - && mpz_fits_ushort_p(intval)) + && nc.to_int(&intval)) { 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); Expression* se = Expression::make_string(s, loc); return se->get_backend(context); -- 2.30.2