compiler: make Slice_construction_expression::do_flatten idempotent
authorIan Lance Taylor <ian@gcc.gnu.org>
Thu, 8 Dec 2016 15:51:25 +0000 (15:51 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Thu, 8 Dec 2016 15:51:25 +0000 (15:51 +0000)
    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

gcc/go/gofrontend/MERGE
gcc/go/gofrontend/expressions.cc

index 7586fd48f63471471ced1f5eac6f27ab3d0ddd6b..dbba68fb26058e9c86c4c707a5ca1c09eb4733b8 100644 (file)
@@ -1,4 +1,4 @@
-08d221726e3f50cb197a931ba385fac67f66a028
+7a941ba323660ec7034cd92d4eab466024a3c72c
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 24f6b125c7d27e14b2356ee33f185c11c1ad134b..899fc9b4053e799ace2da38bd6515c79fbe463b7 100644 (file)
@@ -12951,8 +12951,8 @@ Slice_construction_expression::do_flatten(Gogo* gogo, Named_object* no,
   // Base class flattening first
   this->Array_construction_expression::do_flatten(gogo, no, inserter);
 
-  // Create an stack-allocated storage temp if storage won't escape
-  if (!this->storage_escapes_)
+  // Create a stack-allocated storage temp if storage won't escape
+  if (!this->storage_escapes_ && this->slice_storage_ == NULL)
     {
       Location loc = this->location();
       this->array_val_ = create_array_val();