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 a93dedb..f1bbc37 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 82f9fb0..2d34a28 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_);