Set type of array length expressions.
authorIan Lance Taylor <ian@gcc.gnu.org>
Thu, 24 Feb 2011 05:08:26 +0000 (05:08 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Thu, 24 Feb 2011 05:08:26 +0000 (05:08 +0000)
From-SVN: r170460

gcc/go/gofrontend/types.cc

index 806226f6f424253d19adba22981925c25c7501b8..3e149b93734d58ebc84ccc7949f16f07ef49bf5e 100644 (file)
@@ -4287,6 +4287,10 @@ Array_type::verify_length()
 {
   if (this->length_ == NULL)
     return true;
+
+  Type_context context(Type::lookup_integer_type("int"), false);
+  this->length_->determine_type(&context);
+
   if (!this->length_->is_constant())
     {
       error_at(this->length_->location(), "array bound is not constant");
@@ -4294,30 +4298,23 @@ Array_type::verify_length()
     }
 
   mpz_t val;
-
-  Type* t = this->length_->type();
-  if (t->integer_type() != NULL)
+  mpz_init(val);
+  Type* vt;
+  if (!this->length_->integer_constant_value(true, val, &vt))
     {
-      Type* vt;
-      mpz_init(val);
-      if (!this->length_->integer_constant_value(true, val, &vt))
-       {
-         error_at(this->length_->location(),
-                  "array bound is not constant");
-         mpz_clear(val);
-         return false;
-       }
-    }
-  else if (t->float_type() != NULL)
-    {
-      Type* vt;
       mpfr_t fval;
       mpfr_init(fval);
       if (!this->length_->float_constant_value(fval, &vt))
        {
-         error_at(this->length_->location(),
-                  "array bound is not constant");
+         if (this->length_->type()->integer_type() != NULL
+             || this->length_->type()->float_type() != NULL)
+           error_at(this->length_->location(),
+                    "array bound is not constant");
+         else
+           error_at(this->length_->location(),
+                    "array bound is not numeric");
          mpfr_clear(fval);
+         mpz_clear(val);
          return false;
        }
       if (!mpfr_integer_p(fval))
@@ -4325,18 +4322,13 @@ Array_type::verify_length()
          error_at(this->length_->location(),
                   "array bound truncated to integer");
          mpfr_clear(fval);
+         mpz_clear(val);
          return false;
        }
       mpz_init(val);
       mpfr_get_z(val, fval, GMP_RNDN);
       mpfr_clear(fval);
     }
-  else
-    {
-      if (!t->is_error_type())
-       error_at(this->length_->location(), "array bound is not numeric");
-      return false;
-    }
 
   if (mpz_sgn(val) < 0)
     {