compiler: If unary & does not escape, the var does not escape.
authorIan Lance Taylor <ian@gcc.gnu.org>
Tue, 12 May 2015 22:13:01 +0000 (22:13 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Tue, 12 May 2015 22:13:01 +0000 (22:13 +0000)
If we have a unary & that takes the address of a variable, do
not force the variable to escape if the unary & does not
escape.

From-SVN: r223100

gcc/go/gofrontend/expressions.cc

index e811a8d2a447ab83a0eb6c69f71d7f9dbde74aaa..05ab42b55da44e867c42a50267e090bada7869b7 100644 (file)
@@ -3668,7 +3668,12 @@ Unary_expression::do_flatten(Gogo* gogo, Named_object*,
 
   if (this->op_ == OPERATOR_AND)
     {
-      if (this->expr_->var_expression() != NULL)
+      // If this->escapes_ is false at this point, then it was set to
+      // false by an explicit call to set_does_not_escape, and the
+      // value does not escape.  If this->escapes_ is true, we may be
+      // able to set it to false if taking the address of a variable
+      // that does not escape.
+      if (this->escapes_ && this->expr_->var_expression() != NULL)
        {
          Named_object* var = this->expr_->var_expression()->named_object();
          if (var->is_variable())