From 20d5c8731f4bc1aa72ced6cf61016407b74109d5 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Mon, 12 Jun 2017 17:51:52 +0000 Subject: [PATCH] compiler: avoid orphaning Bexpressions when processing conversions The method Type_conversion_expression::do_get_backend was (in some circumstances) creating a Bexpression for the source expression of the conversion and then throwing it away before using it. Fix up this method to insure that the call to get_backend() on the source expression is only made when the result will be used. Reviewed-on: https://go-review.googlesource.com/45350 From-SVN: r249131 --- gcc/go/gofrontend/MERGE | 2 +- gcc/go/gofrontend/expressions.cc | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index 1bfac59adef..aebab77b1d3 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -d4875b19266d5f726e0e32843b903075f5c50b4c +61222d34c1b33a369bd86008a0541455dd17727e 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 d6d27eea8d3..5eec731733f 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -3410,11 +3410,13 @@ Type_conversion_expression::do_get_backend(Translate_context* context) Gogo* gogo = context->gogo(); Btype* btype = type->get_backend(gogo); - Bexpression* bexpr = this->expr_->get_backend(context); Location loc = this->location(); if (Type::are_identical(type, expr_type, false, NULL)) - return gogo->backend()->convert_expression(btype, bexpr, loc); + { + Bexpression* bexpr = this->expr_->get_backend(context); + return gogo->backend()->convert_expression(btype, bexpr, loc); + } else if (type->interface_type() != NULL || expr_type->interface_type() != NULL) { @@ -3483,6 +3485,7 @@ Type_conversion_expression::do_get_backend(Translate_context* context) else if (type->is_numeric_type()) { go_assert(Type::are_convertible(type, expr_type, NULL)); + Bexpression* bexpr = this->expr_->get_backend(context); return gogo->backend()->convert_expression(btype, bexpr, loc); } else if ((type->is_unsafe_pointer_type() @@ -3493,7 +3496,10 @@ Type_conversion_expression::do_get_backend(Translate_context* context) || (this->may_convert_function_types_ && type->function_type() != NULL && expr_type->function_type() != NULL)) - return gogo->backend()->convert_expression(btype, bexpr, loc); + { + Bexpression* bexpr = this->expr_->get_backend(context); + return gogo->backend()->convert_expression(btype, bexpr, loc); + } else { Expression* conversion = -- 2.30.2