aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2018-07-10 00:55:28 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2018-07-10 00:55:28 +0000
commitc0cb9a9da0a7e257297deb25193cc9f113ee672a (patch)
tree26c3014d414d02aa217dd23af1afbe63837aa7f7
parentfd7ec17d0ba5bce1f71aff0d4ac80eb07121a1d3 (diff)
downloadgcc-c0cb9a9da0a7e257297deb25193cc9f113ee672a.zip
gcc-c0cb9a9da0a7e257297deb25193cc9f113ee672a.tar.gz
gcc-c0cb9a9da0a7e257297deb25193cc9f113ee672a.tar.bz2
compiler: fix double evaluation with interface field expression
In Interface_field_reference_expression, the interface expression is used in two places, so a temporary variable is used. Previously, we used a Set_and_use_temporary_expression, which, when evaluated twice, causes double evaluation of the underlying expression. Fix by setting the temporary once and use Temporary_reference_expression instead. Fixes golang/go#26248. Reviewed-on: https://go-review.googlesource.com/122756 From-SVN: r262533
-rw-r--r--gcc/go/gofrontend/MERGE2
-rw-r--r--gcc/go/gofrontend/expressions.cc5
2 files changed, 3 insertions, 4 deletions
diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE
index e65c0bc..8a63818 100644
--- a/gcc/go/gofrontend/MERGE
+++ b/gcc/go/gofrontend/MERGE
@@ -1,4 +1,4 @@
-94738979a3422e845acf358a766aabf8b9275d43
+8ad67a72a4fa59efffc891e73ecf10020e3c565d
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc
index 75b8b69..89b265b 100644
--- a/gcc/go/gofrontend/expressions.cc
+++ b/gcc/go/gofrontend/expressions.cc
@@ -11886,10 +11886,9 @@ Interface_field_reference_expression::do_flatten(Gogo*, Named_object*,
if (!this->expr_->is_variable())
{
Temporary_statement* temp =
- Statement::make_temporary(this->expr_->type(), NULL, this->location());
+ Statement::make_temporary(NULL, this->expr_, this->location());
inserter->insert(temp);
- this->expr_ = Expression::make_set_and_use_temporary(temp, this->expr_,
- this->location());
+ this->expr_ = Expression::make_temporary_reference(temp, this->location());
}
return this;
}