Commit 1ac22e76 by Ian Lance Taylor

re PR go/65717 (64-bit runtime FAILs with 32-bit compiler)

	PR go/65717
    compiler: Fix array reflection when len doesn't fit in unsigned long.
    
    This comes up when using a 32-bit host and a 64-bit target.
    
    Fixes https://gcc.gnu.org/PR65717.
    
    Reviewed-on: https://go-review.googlesource.com/17330

From-SVN: r231142
parent 867038d7
81eb6a3f425b2158c67ee32c0cc973a72ce9d6be
c375f3bf470f94220149b486c947bb3eb57cde7d
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
......@@ -6398,22 +6398,21 @@ Array_type::do_reflection(Gogo* gogo, std::string* ret) const
if (this->length_ != NULL)
{
Numeric_constant nc;
unsigned long val;
if (!this->length_->numeric_constant_value(&nc)
|| nc.to_unsigned_long(&val) != Numeric_constant::NC_UL_VALID)
if (!this->length_->numeric_constant_value(&nc))
{
if (!this->issued_length_error_)
{
error_at(this->length_->location(), "invalid array length");
this->issued_length_error_ = true;
}
go_assert(saw_errors());
return;
}
else
mpz_t val;
if (!nc.to_int(&val))
{
char buf[50];
snprintf(buf, sizeof buf, "%lu", val);
ret->append(buf);
go_assert(saw_errors());
return;
}
char* s = mpz_get_str(NULL, 10, val);
ret->append(s);
free(s);
mpz_clear(val);
}
ret->push_back(']');
......@@ -6544,22 +6543,21 @@ Array_type::do_mangled_name(Gogo* gogo, std::string* ret) const
if (this->length_ != NULL)
{
Numeric_constant nc;
unsigned long val;
if (!this->length_->numeric_constant_value(&nc)
|| nc.to_unsigned_long(&val) != Numeric_constant::NC_UL_VALID)
if (!this->length_->numeric_constant_value(&nc))
{
if (!this->issued_length_error_)
{
error_at(this->length_->location(), "invalid array length");
this->issued_length_error_ = true;
}
go_assert(saw_errors());
return;
}
else
mpz_t val;
if (!nc.to_int(&val))
{
char buf[50];
snprintf(buf, sizeof buf, "%lu", val);
ret->append(buf);
go_assert(saw_errors());
return;
}
char *s = mpz_get_str(NULL, 10, val);
ret->append(s);
free(s);
mpz_clear(val);
}
ret->push_back('e');
}
......
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