This patch to the Go frontend permits inlining functions with receive expressions. This does not permit any new inlinable functions in the standard library. Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu. Committed to mainline.
Ian
Index: gcc/go/gofrontend/MERGE =================================================================== --- gcc/go/gofrontend/MERGE (revision 271063) +++ gcc/go/gofrontend/MERGE (working copy) @@ -1,4 +1,4 @@ -b5e4ba88a2e7f3c34e9183f43370c38ea639c393 +76ab85364745e445498fe53f9ca8e37b49650779 The first line of this file holds the git revision number of the last merge done from the gofrontend repository. Index: gcc/go/gofrontend/expressions.cc =================================================================== --- gcc/go/gofrontend/expressions.cc (revision 271063) +++ gcc/go/gofrontend/expressions.cc (working copy) @@ -15423,6 +15423,15 @@ Receive_expression::do_get_backend(Trans 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 @@ Receive_expression::do_dump_expression(A 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 @@ Expression::import_expression(Import_exp // 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"))) Index: gcc/go/gofrontend/expressions.h =================================================================== --- gcc/go/gofrontend/expressions.h (revision 271021) +++ gcc/go/gofrontend/expressions.h (working copy) @@ -3982,6 +3982,9 @@ class Receive_expression : public Expres channel() { return this->channel_; } + static Expression* + do_import(Import_expression*, Location); + protected: int do_traverse(Traverse* traverse) @@ -4010,6 +4013,10 @@ class Receive_expression : public Expres 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 @@ class Receive_expression : public Expres do_get_backend(Translate_context*); void + do_export(Export_function_body*) const; + + void do_dump_expression(Ast_dump_context*) const; private: