compiler: resolve importing ambiguity for more complex function calls
authorIan Lance Taylor <ian@gcc.gnu.org>
Sat, 28 Sep 2019 00:16:57 +0000 (00:16 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Sat, 28 Sep 2019 00:16:57 +0000 (00:16 +0000)
    Tweak the exporter for inlinable function bodies to work around a
    problem with importing of function calls whose function expressions
    are not simple function names. In the bug in question, the function
    body exporter was writing out a function call of the form

           (*(*FuncTyp)(var))(arg)

    which produced an export data representation of

           *$convert(<type 5>, var)(x)

    which is hard to parse unambiguously. Fix: change the export data
    emitter to introduce parens around the function expression for more
    complex calls.

    Testcase for this bug is in CL 197217.

    Fixes golang/go#34503.

    Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/197122

From-SVN: r276228

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

index 1e6ca6fa5dd97cf9ce8582997466491c59cd5aa4..3f2c3dcdd0e5fec75cad6be7d1207bef65e5a173 100644 (file)
@@ -1,4 +1,4 @@
-9112ea664ed9ee5f108158a913812adaf03edf6e
+10a1671d94ddc0c39f2f4b039e5ea33358f414c0
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 7d8963e2c0be835f2121070f5a1c76ad6b25715f..a72ba243f376ff79d5a6fce0585869a6148a2710 100644 (file)
@@ -12373,7 +12373,12 @@ Call_expression::do_inlining_cost() const
 void
 Call_expression::do_export(Export_function_body* efb) const
 {
+  bool simple_call = (this->fn_->func_expression() != NULL);
+  if (!simple_call)
+    efb->write_c_string("(");
   this->fn_->export_expression(efb);
+  if (!simple_call)
+    efb->write_c_string(")");
   this->export_arguments(efb);
 }