Commit 20d5c873 by Ian Lance Taylor

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
parent 754d67d5
d4875b19266d5f726e0e32843b903075f5c50b4c 61222d34c1b33a369bd86008a0541455dd17727e
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -3410,11 +3410,13 @@ Type_conversion_expression::do_get_backend(Translate_context* context) ...@@ -3410,11 +3410,13 @@ Type_conversion_expression::do_get_backend(Translate_context* context)
Gogo* gogo = context->gogo(); Gogo* gogo = context->gogo();
Btype* btype = type->get_backend(gogo); Btype* btype = type->get_backend(gogo);
Bexpression* bexpr = this->expr_->get_backend(context);
Location loc = this->location(); Location loc = this->location();
if (Type::are_identical(type, expr_type, false, NULL)) 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 else if (type->interface_type() != NULL
|| expr_type->interface_type() != NULL) || expr_type->interface_type() != NULL)
{ {
...@@ -3483,6 +3485,7 @@ Type_conversion_expression::do_get_backend(Translate_context* context) ...@@ -3483,6 +3485,7 @@ Type_conversion_expression::do_get_backend(Translate_context* context)
else if (type->is_numeric_type()) else if (type->is_numeric_type())
{ {
go_assert(Type::are_convertible(type, expr_type, NULL)); go_assert(Type::are_convertible(type, expr_type, NULL));
Bexpression* bexpr = this->expr_->get_backend(context);
return gogo->backend()->convert_expression(btype, bexpr, loc); return gogo->backend()->convert_expression(btype, bexpr, loc);
} }
else if ((type->is_unsafe_pointer_type() else if ((type->is_unsafe_pointer_type()
...@@ -3493,7 +3496,10 @@ Type_conversion_expression::do_get_backend(Translate_context* context) ...@@ -3493,7 +3496,10 @@ Type_conversion_expression::do_get_backend(Translate_context* context)
|| (this->may_convert_function_types_ || (this->may_convert_function_types_
&& type->function_type() != NULL && type->function_type() != NULL
&& expr_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 else
{ {
Expression* conversion = Expression* conversion =
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment