compiler: emit underlying constant in array_type length export
authorIan Lance Taylor <ian@gcc.gnu.org>
Wed, 6 Mar 2019 20:40:32 +0000 (20:40 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Wed, 6 Mar 2019 20:40:32 +0000 (20:40 +0000)
    In Array_type::do_export, when emitting a concrete array length,
    evaluate the length expression to an integer constant and emit that
    constant, instead of calling the more general method for emitting
    expressions. This is to avoid the possibility that we will need
    to emit a conversion, which could confuse the gccgoimporter.

    Fixes golang/go#30628.

    Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/165741

From-SVN: r269443

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

index a93dedb7aaf4311961ebc4dac303547f08a6113a..f1bbc376d8a492d5658eecb31760059eba1efd86 100644 (file)
@@ -1,4 +1,4 @@
-13c98c3477647888fc7a186e9055793b0961e806
+959260238817af3205fb9907dd92319291e6a893
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 82f9fb02b400e837a163525c34bebe69b1468b52..2d34a289b2d722cadff2bda992ae68d7884c2715 100644 (file)
@@ -7581,10 +7581,17 @@ Array_type::do_export(Export* exp) const
   exp->write_c_string("[");
   if (this->length_ != NULL)
     {
-      Export_function_body efb(exp, 0);
-      efb.set_type_context(this->length_->type());
-      this->length_->export_expression(&efb);
-      exp->write_string(efb.body());
+      Numeric_constant nc;
+      mpz_t val;
+      if (!this->length_->numeric_constant_value(&nc) || !nc.to_int(&val))
+        {
+         go_assert(saw_errors());
+          return;
+        }
+      char* s = mpz_get_str(NULL, 10, val);
+      exp->write_string(s);
+      exp->write_string(" ");
+      mpz_clear(val);
     }
   exp->write_c_string("] ");
   exp->write_type(this->element_type_);