From: Ian Lance Taylor Date: Tue, 10 Jul 2018 00:55:28 +0000 (+0000) Subject: compiler: fix double evaluation with interface field expression X-Git-Tag: basepoints/gcc-10~5455 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c0cb9a9da0a7e257297deb25193cc9f113ee672a;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index e65c0bc574b1..8a63818951be 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 75b8b69383ce..89b265b9b6bb 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; }