compiler: Use backend interface for sink expressions.
authorIan Lance Taylor <ian@gcc.gnu.org>
Mon, 5 May 2014 19:05:59 +0000 (19:05 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Mon, 5 May 2014 19:05:59 +0000 (19:05 +0000)
From-SVN: r210078

gcc/go/gofrontend/expressions.cc

index c52b3968c2c3227de80ea9911c2b4dfd69acbed1..a4f959da09d0ed0efb38e76197ebc24cfaef6234 100644 (file)
@@ -931,7 +931,7 @@ class Sink_expression : public Expression
  public:
   Sink_expression(Location location)
     : Expression(EXPRESSION_SINK, location),
-      type_(NULL), var_(NULL_TREE)
+      type_(NULL), bvar_(NULL)
   { }
 
  protected:
@@ -959,7 +959,7 @@ class Sink_expression : public Expression
   // 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 @@ Sink_expression::do_determine_type(const Type_context* context)
 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");
+      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 this->var_;
+  return expr_to_tree(gogo->backend()->var_expression(this->bvar_, loc));
 }
 
 // Ast dump for sink expression.