From: Ian Lance Taylor Date: Tue, 24 Nov 2020 01:48:28 +0000 (-0800) Subject: compiler: avoid silent truncation for string(1 << 32) X-Git-Tag: basepoints/gcc-12~2890 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4aff491ffcb1312c7745758301df6d22c0c70200;p=thirdparty%2Fgcc.git compiler: avoid silent truncation for string(1 << 32) In the conversion of a constant integer to a string type, the value of the constant integer was being silently truncated from unsigned long to unsigned int, producing the wrong string value. Add an explicit overflow check to avoid this problem. For golang/go#42790 Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/272611 --- diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index 3e94dabcd307..c14ee7e7b142 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -78c9a657fdbc9e812d39910fb93fbae4affe4360 +8cbe18aff99dbf79bd1adb9c025418e84505ffd5 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 6bc93488939d..448888b0ad76 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -4024,8 +4024,16 @@ Type_conversion_expression::do_string_constant_value(std::string* val) const unsigned long ival; if (nc.to_unsigned_long(&ival) == Numeric_constant::NC_UL_VALID) { + unsigned int cval = static_cast(ival); + if (static_cast(cval) != ival) + { + go_warning_at(this->location(), 0, + "unicode code point 0x%lx out of range", + ival); + cval = 0xfffd; // Unicode "replacement character." + } val->clear(); - Lex::append_char(ival, true, val, this->location()); + Lex::append_char(cval, true, val, this->location()); return true; } }