compiler: permit inlining receive expressions

This does not permit any new inlinable functions in the standard library.

Change-Id: Iae19b3b061db862b9991074f8172e30070cd550f
Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/176637
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Than McIntosh <thanm@google.com>
diff --git a/go/expressions.cc b/go/expressions.cc
index ed65852..54f6e52 100644
--- a/go/expressions.cc
+++ b/go/expressions.cc
@@ -15423,6 +15423,15 @@
   return Expression::make_compound(recv, recv_ref, loc)->get_backend(context);
 }
 
+// Export a receive expression.
+
+void
+Receive_expression::do_export(Export_function_body* efb) const
+{
+  efb->write_c_string("<-");
+  this->channel_->export_expression(efb);
+}
+
 // Dump ast representation for a receive expression.
 
 void
@@ -15432,6 +15441,16 @@
   ast_dump_context->dump_expression(channel_);
 }
 
+// Import a receive expression.
+
+Expression*
+Receive_expression::do_import(Import_expression* imp, Location loc)
+{
+  imp->require_c_string("<-");
+  Expression* expr = Expression::import_expression(imp, loc);
+  return Expression::make_receive(expr, loc);
+}
+
 // Make a receive expression.
 
 Receive_expression*
@@ -16783,6 +16802,8 @@
       // This handles integers, floats and complex constants.
       return Integer_expression::do_import(imp, loc);
     }
+  else if (imp->match_c_string("<-"))
+    return Receive_expression::do_import(imp, loc);
   else if (imp->match_c_string("$nil")
 	   || (imp->version() < EXPORT_FORMAT_V3
 	       && imp->match_c_string("nil")))
diff --git a/go/expressions.h b/go/expressions.h
index 2cca824..9ed81f1 100644
--- a/go/expressions.h
+++ b/go/expressions.h
@@ -3982,6 +3982,9 @@
   channel()
   { return this->channel_; }
 
+  static Expression*
+  do_import(Import_expression*, Location);
+
  protected:
   int
   do_traverse(Traverse* traverse)
@@ -4010,6 +4013,10 @@
     return Expression::make_receive(this->channel_->copy(), this->location());
   }
 
+  int
+  do_inlining_cost() const
+  { return 1; }
+
   bool
   do_must_eval_in_order() const
   { return true; }
@@ -4018,6 +4025,9 @@
   do_get_backend(Translate_context*);
 
   void
+  do_export(Export_function_body*) const;
+
+  void
   do_dump_expression(Ast_dump_context*) const;
 
  private: