mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
04bfa1e469
commit
55dccc1e0d
|
|
@ -1,4 +1,4 @@
|
||||||
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,
|
||||||
// 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();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue