]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
compiler: Use backend interface for temporary reference expressions.
authorChris Manghane <cmang@google.com>
Fri, 4 Oct 2013 18:07:20 +0000 (18:07 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Fri, 4 Oct 2013 18:07:20 +0000 (18:07 +0000)
* go-gcc.cc (Backend::convert_expression): New function.

From-SVN: r203209

gcc/go/ChangeLog
gcc/go/go-gcc.cc
gcc/go/gofrontend/backend.h
gcc/go/gofrontend/expressions.cc

index 0c9340600b03cc06a7041235c06d3c4e2af7f178..eddf39326c3eaddacf31fc179199dea7799f7c70 100644 (file)
@@ -1,3 +1,7 @@
+2013-10-04  Chris Manghane  <cmang@google.com>
+
+       * go-gcc.cc (Backend::convert_expression): New function.
+
 2013-10-02  Chris Manghane  <cmang@google.com>
 
        * go-gcc.cc: Include "real.h" and "realmpfr.h".
index 55b60ade21d48e8952c80fd51f2b531fa1ae5178..fcfd41b34ab3cfdf00e3ade32734ea88686ceb48 100644 (file)
@@ -229,6 +229,9 @@ class Gcc_backend : public Backend
   Bexpression*
   complex_constant_expression(Btype* btype, mpfr_t real, mpfr_t imag);
 
+  Bexpression*
+  convert_expression(Btype* type, Bexpression* expr, Location);
+
   // Statements.
 
   Bstatement*
@@ -949,6 +952,20 @@ Gcc_backend::complex_constant_expression(Btype* btype, mpfr_t real, mpfr_t imag)
   return tree_to_expr(ret);
 }
 
+// An expression that converts an expression to a different type.
+
+Bexpression*
+Gcc_backend::convert_expression(Btype* type, Bexpression* expr, Location)
+{
+  tree type_tree = type->get_tree();
+  tree expr_tree = expr->get_tree();
+  if (type_tree == error_mark_node || expr_tree == error_mark_node)
+    return this->error_expression();
+
+  tree ret = fold_convert(type_tree, expr_tree);
+  return tree_to_expr(ret);
+}
+
 // An expression as a statement.
 
 Bstatement*
index d0abdd7f7989808b7ba1d1a6524221f156f72d48..fa3e3cc689336e0b6983bc755bccfb77471793b5 100644 (file)
@@ -262,6 +262,10 @@ class Backend
   virtual Bexpression*
   complex_constant_expression(Btype* btype, mpfr_t real, mpfr_t imag) = 0;
 
+  // Return an expression that converts EXPR to TYPE.
+  virtual Bexpression*
+  convert_expression(Btype* type, Bexpression* expr, Location) = 0;
+
   // Statements.
 
   // Create an error statement.  This is used for cases which should
index 67bec710df5e51310db315dad671d1c696524278..13d4c1c789a6fac44813c595f5a01b3629c196e2 100644 (file)
@@ -995,23 +995,24 @@ Temporary_reference_expression::do_address_taken(bool)
 tree
 Temporary_reference_expression::do_get_tree(Translate_context* context)
 {
+  Gogo* gogo = context->gogo();
   Bvariable* bvar = this->statement_->get_backend_variable(context);
+  Bexpression* ret = gogo->backend()->var_expression(bvar, this->location());
 
-  // The gcc backend can't represent the same set of recursive types
+  // The backend can't always represent the same set of recursive types
   // that the Go frontend can.  In some cases this means that a
   // temporary variable won't have the right backend type.  Correct
   // that here by adding a type cast.  We need to use base() to push
   // the circularity down one level.
-  tree ret = var_to_tree(bvar);
+  Type* stype = this->statement_->type();
   if (!this->is_lvalue_
-      && POINTER_TYPE_P(TREE_TYPE(ret))
-      && VOID_TYPE_P(TREE_TYPE(TREE_TYPE(ret))))
+      && stype->has_pointer()
+      && stype->deref()->is_void_type())
     {
-      Btype* type_btype = this->type()->base()->get_backend(context->gogo());
-      tree type_tree = type_to_tree(type_btype);
-      ret = fold_convert_loc(this->location().gcc_location(), type_tree, ret);
+      Btype* btype = this->type()->base()->get_backend(gogo);
+      ret = gogo->backend()->convert_expression(btype, ret, this->location());
     }
-  return ret;
+  return expr_to_tree(ret);
 }
 
 // Ast dump for temporary reference.