This patch by Chris Manghane changes the Go frontend to use the backend interface for sink expressions. Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu. Committed to mainline.
Ian
diff -r e59376bb96c4 go/expressions.cc --- a/go/expressions.cc Mon May 05 14:49:01 2014 -0400 +++ b/go/expressions.cc Mon May 05 14:53:13 2014 -0400 @@ -931,7 +931,7 @@ public: Sink_expression(Location location) : Expression(EXPRESSION_SINK, location), - type_(NULL), var_(NULL_TREE) + type_(NULL), bvar_(NULL) { } protected: @@ -959,7 +959,7 @@ // The type of this sink variable. Type* type_; // The temporary variable we generate. - tree var_; + Bvariable* bvar_; }; // Return the type of a sink expression. @@ -987,13 +987,24 @@ tree Sink_expression::do_get_tree(Translate_context* context) { - if (this->var_ == NULL_TREE) + Location loc = this->location(); + Gogo* gogo = context->gogo(); + if (this->bvar_ == NULL) { go_assert(this->type_ != NULL && !this->type_->is_sink_type()); + Named_object* fn = context->function(); + go_assert(fn != NULL); + Bfunction* fn_ctx = fn->func_value()->get_or_make_decl(gogo, fn); Btype* bt = this->type_->get_backend(context->gogo()); - this->var_ = create_tmp_var(type_to_tree(bt), "blank"); - } - return this->var_; + Bstatement* decl; + this->bvar_ = + gogo->backend()->temporary_variable(fn_ctx, context->bblock(), bt, NULL, + false, loc, &decl); + Bexpression* var_ref = gogo->backend()->var_expression(this->bvar_, loc); + var_ref = gogo->backend()->compound_expression(decl, var_ref, loc); + return expr_to_tree(var_ref); + } + return expr_to_tree(gogo->backend()->var_expression(this->bvar_, loc)); } // Ast dump for sink expression.