re PR go/65717 (64-bit runtime FAILs with 32-bit compiler)
authorIan Lance Taylor <ian@gcc.gnu.org>
Wed, 2 Dec 2015 01:28:26 +0000 (01:28 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Wed, 2 Dec 2015 01:28:26 +0000 (01:28 +0000)
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

gcc/go/gofrontend/MERGE
gcc/go/gofrontend/types.cc

index 80136abcf76c0804a99c65eff00c10eb888f6f00..b4c90ef8892fae5b0931099b37967b5707c18ef1 100644 (file)
@@ -1,4 +1,4 @@
-81eb6a3f425b2158c67ee32c0cc973a72ce9d6be
+c375f3bf470f94220149b486c947bb3eb57cde7d
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 64b560b45d6f259b8b1ec5d2d85567a0dd749808..802a17dc0e381aa41ad562058f35d5db3793c27d 100644 (file)
@@ -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');
 }