compiler: avoid orphaning Bexpressions when processing conversions
authorIan Lance Taylor <ian@gcc.gnu.org>
Mon, 12 Jun 2017 17:51:52 +0000 (17:51 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Mon, 12 Jun 2017 17:51:52 +0000 (17:51 +0000)
    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
gcc/go/gofrontend/expressions.cc

index 1bfac59adef5ed766ab0344ea441dfc9d029f79a..aebab77b1d3977ff75c2f5dd09a0b4b216742aba 100644 (file)
@@ -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.
index d6d27eea8d34e6859fb800970ad4a313dd726619..5eec731733fbd0dce2a97d8c7f82d27cacbc3fea 100644 (file)
@@ -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 =