This patch from Chris Manghane changes the Go frontend to use the backend interface for bound method expressions. Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu. Committed to mainline.
Ian
diff -r e828f77c32b7 go/expressions.cc --- a/go/expressions.cc Thu May 01 15:18:08 2014 -0400 +++ b/go/expressions.cc Mon May 05 12:54:14 2014 -0400 @@ -6736,12 +6736,9 @@ Expression* ret = Expression::make_struct_composite_literal(st, vals, loc); ret = Expression::make_heap_expression(ret, loc); - tree ret_tree = ret->get_tree(context); + // See whether the expression or any embedded pointers are nil. Expression* nil_check = NULL; - - // See whether the expression or any embedded pointers are nil. - Expression* expr = this->expr_; if (this->method_->field_indexes() != NULL) { @@ -6764,26 +6761,19 @@ nil_check = Expression::make_binary(OPERATOR_OROR, nil_check, n, loc); } + Bexpression* bme = tree_to_expr(ret->get_tree(context)); if (nil_check != NULL) { - tree nil_check_tree = nil_check->get_tree(context); - Expression* crash_expr = - context->gogo()->runtime_error(RUNTIME_ERROR_NIL_DEREFERENCE, loc); - tree crash = crash_expr->get_tree(context); - if (ret_tree == error_mark_node - || nil_check_tree == error_mark_node - || crash == error_mark_node) - return error_mark_node; - - ret_tree = fold_build2_loc(loc.gcc_location(), COMPOUND_EXPR, - TREE_TYPE(ret_tree), - build3_loc(loc.gcc_location(), COND_EXPR, - void_type_node, nil_check_tree, - crash, NULL_TREE), - ret_tree); - } - - return ret_tree; + Gogo* gogo = context->gogo(); + Expression* crash = + gogo->runtime_error(RUNTIME_ERROR_NIL_DEREFERENCE, loc); + Bexpression* bcrash = tree_to_expr(crash->get_tree(context)); + Btype* btype = ret->type()->get_backend(gogo); + Bexpression* bcheck = tree_to_expr(nil_check->get_tree(context)); + bme = gogo->backend()->conditional_expression(btype, bcheck, bcrash, + bme, loc); + } + return expr_to_tree(bme); } // Dump ast representation of a bound method expression.