Commit 1c98301f by Ian Lance Taylor

compiler: emit underlying constant in array_type length export

    
    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
parent 2de5d0ea
13c98c3477647888fc7a186e9055793b0961e806 959260238817af3205fb9907dd92319291e6a893
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.
...@@ -7581,10 +7581,17 @@ Array_type::do_export(Export* exp) const ...@@ -7581,10 +7581,17 @@ Array_type::do_export(Export* exp) const
exp->write_c_string("["); exp->write_c_string("[");
if (this->length_ != NULL) if (this->length_ != NULL)
{ {
Export_function_body efb(exp, 0); Numeric_constant nc;
efb.set_type_context(this->length_->type()); mpz_t val;
this->length_->export_expression(&efb); if (!this->length_->numeric_constant_value(&nc) || !nc.to_int(&val))
exp->write_string(efb.body()); {
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_c_string("] ");
exp->write_type(this->element_type_); exp->write_type(this->element_type_);
......
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