compiler: insert backend type conversion for closure func ptr
authorIan Lance Taylor <ian@gcc.gnu.org>
Tue, 18 Jul 2017 23:29:15 +0000 (23:29 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Tue, 18 Jul 2017 23:29:15 +0000 (23:29 +0000)
    In Func_expression::do_get_backend when creating the backend
    representation for a closure, create a backend type conversion to
    account for potential differences between the closure struct type
    (where the number of fields is dependent on the number of values
    referenced in the closure) and the generic function descriptor type
    (struct with single function pointer field).

    Reviewed-on: https://go-review.googlesource.com/49255

From-SVN: r250327

gcc/go/gofrontend/MERGE
gcc/go/gofrontend/expressions.cc

index 0b110e02d632f22dc985ebff214d0374ffc684d7..f6d7a002cbf17e1fa028a35164a1c7426843bfb6 100644 (file)
@@ -1,4 +1,4 @@
-c49ddc84f3ce89310585aad23ab6e51ef5523748
+3d9ff9bc339942922f1be3bef07c6fe2978ad81a
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 12505b239392b87bd113e355513a5646e6835f7b..597f0a0daef26c29aa0186c3c1a6b8ee11a2383d 100644 (file)
@@ -1204,7 +1204,14 @@ Func_expression::do_get_backend(Translate_context* context)
   // expression.  It is a pointer to a struct whose first field points
   // to the function code and whose remaining fields are the addresses
   // of the closed-over variables.
-  return this->closure_->get_backend(context);
+  Bexpression *bexpr = this->closure_->get_backend(context);
+
+  // Introduce a backend type conversion, to account for any differences
+  // between the argument type (function descriptor, struct with a
+  // single field) and the closure (struct with multiple fields).
+  Gogo* gogo = context->gogo();
+  Btype *btype = this->type()->get_backend(gogo);
+  return gogo->backend()->convert_expression(btype, bexpr, this->location());
 }
 
 // Ast dump for function.