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 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.
...@@ -6398,22 +6398,21 @@ Array_type::do_reflection(Gogo* gogo, std::string* ret) const ...@@ -6398,22 +6398,21 @@ Array_type::do_reflection(Gogo* gogo, std::string* ret) const
if (this->length_ != NULL) if (this->length_ != NULL)
{ {
Numeric_constant nc; Numeric_constant nc;
unsigned long val; if (!this->length_->numeric_constant_value(&nc))
if (!this->length_->numeric_constant_value(&nc)
|| nc.to_unsigned_long(&val) != Numeric_constant::NC_UL_VALID)
{ {
if (!this->issued_length_error_) go_assert(saw_errors());
{ return;
error_at(this->length_->location(), "invalid array length");
this->issued_length_error_ = true;
}
} }
else mpz_t val;
if (!nc.to_int(&val))
{ {
char buf[50]; go_assert(saw_errors());
snprintf(buf, sizeof buf, "%lu", val); return;
ret->append(buf);
} }
char* s = mpz_get_str(NULL, 10, val);
ret->append(s);
free(s);
mpz_clear(val);
} }
ret->push_back(']'); ret->push_back(']');
...@@ -6544,22 +6543,21 @@ Array_type::do_mangled_name(Gogo* gogo, std::string* ret) const ...@@ -6544,22 +6543,21 @@ Array_type::do_mangled_name(Gogo* gogo, std::string* ret) const
if (this->length_ != NULL) if (this->length_ != NULL)
{ {
Numeric_constant nc; Numeric_constant nc;
unsigned long val; if (!this->length_->numeric_constant_value(&nc))
if (!this->length_->numeric_constant_value(&nc)
|| nc.to_unsigned_long(&val) != Numeric_constant::NC_UL_VALID)
{ {
if (!this->issued_length_error_) go_assert(saw_errors());
{ return;
error_at(this->length_->location(), "invalid array length");
this->issued_length_error_ = true;
}
} }
else mpz_t val;
if (!nc.to_int(&val))
{ {
char buf[50]; go_assert(saw_errors());
snprintf(buf, sizeof buf, "%lu", val); return;
ret->append(buf);
} }
char *s = mpz_get_str(NULL, 10, val);
ret->append(s);
free(s);
mpz_clear(val);
} }
ret->push_back('e'); 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