From 38109dbe011a7f69dc36c402186f6ffb2b385ac5 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 12 May 2015 22:13:01 +0000 Subject: [PATCH] compiler: If unary & does not escape, the var does not escape. 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 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc index e811a8d2a44..05ab42b55da 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -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())