Commit 55dccc1e by Ian Lance Taylor

compiler: make Slice_construction_expression::do_flatten idempotent

    
    Because of the way we handle call expressions with multiple results,
    it's possible for expressions to be flattened more than once.  In the
    case of Slice_construction_expression, allocating the slice storage
    multiple times caused a compiler crash as one of the
    Temporary_statement's wound up not getting a backend expression.
    
    Test case is https://golang.org/cl/34020.
    
    Reviewed-on: https://go-review.googlesource.com/34026

From-SVN: r243442
parent 04bfa1e4
08d221726e3f50cb197a931ba385fac67f66a028 7a941ba323660ec7034cd92d4eab466024a3c72c
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.
...@@ -12951,8 +12951,8 @@ Slice_construction_expression::do_flatten(Gogo* gogo, Named_object* no, ...@@ -12951,8 +12951,8 @@ Slice_construction_expression::do_flatten(Gogo* gogo, Named_object* no,
// Base class flattening first // Base class flattening first
this->Array_construction_expression::do_flatten(gogo, no, inserter); this->Array_construction_expression::do_flatten(gogo, no, inserter);
// Create an stack-allocated storage temp if storage won't escape // Create a stack-allocated storage temp if storage won't escape
if (!this->storage_escapes_) if (!this->storage_escapes_ && this->slice_storage_ == NULL)
{ {
Location loc = this->location(); Location loc = this->location();
this->array_val_ = create_array_val(); this->array_val_ = create_array_val();
......
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