aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2019-05-10 19:41:55 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2019-05-10 19:41:55 +0000
commit4f3952228acc6e60cd5d4e356094319bb2aca010 (patch)
treef984027ce277325a6dd9023205d9846b6f9f9357 /gcc
parentc735deb4fa985b0ab210cbad3802d46a7d4aaa17 (diff)
downloadgcc-4f3952228acc6e60cd5d4e356094319bb2aca010.zip
gcc-4f3952228acc6e60cd5d4e356094319bb2aca010.tar.gz
gcc-4f3952228acc6e60cd5d4e356094319bb2aca010.tar.bz2
compiler: permit inlining receive expressions
This does not permit any new inlinable functions in the standard library. Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/176637 From-SVN: r271074
Diffstat (limited to 'gcc')
-rw-r--r--gcc/go/gofrontend/MERGE2
-rw-r--r--gcc/go/gofrontend/expressions.cc21
-rw-r--r--gcc/go/gofrontend/expressions.h10
3 files changed, 32 insertions, 1 deletions
diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE
index 8158367..d8bcef4 100644
--- a/gcc/go/gofrontend/MERGE
+++ b/gcc/go/gofrontend/MERGE
@@ -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.
diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc
index ed65852..54f6e52 100644
--- a/gcc/go/gofrontend/expressions.cc
+++ b/gcc/go/gofrontend/expressions.cc
@@ -15423,6 +15423,15 @@ Receive_expression::do_get_backend(Translate_context* context)
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(Ast_dump_context* ast_dump_context) const
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_expression* imp, Location loc)
// 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/gcc/go/gofrontend/expressions.h b/gcc/go/gofrontend/expressions.h
index 2cca824..9ed81f1 100644
--- a/gcc/go/gofrontend/expressions.h
+++ b/gcc/go/gofrontend/expressions.h
@@ -3982,6 +3982,9 @@ class Receive_expression : public Expression
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 Expression
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 Expression
do_get_backend(Translate_context*);
void
+ do_export(Export_function_body*) const;
+
+ void
do_dump_expression(Ast_dump_context*) const;
private: