From 92bb02927b92c5d0123431b6b486d2a398770fce Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 9 Jan 2018 23:33:49 +0000 Subject: [PATCH] compiler: make non-escaping Bound_method_expression not heap allocate Bound_method_expression needs a closure. Stack allocate the closure when it does not escape. Reviewed-on: https://go-review.googlesource.com/85638 From-SVN: r256407 --- gcc/go/gofrontend/MERGE | 2 +- gcc/go/gofrontend/expressions.cc | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index b3f314a967c..fe3c16e2fe6 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -584fdecefce831c3471dbd4857ba0ce0be2b5212 +d5774539b17112d9ce709a1fe722daf68eb8594f 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 319fc9e6934..f4dc8e8b43d 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -7030,7 +7030,12 @@ Bound_method_expression::do_flatten(Gogo* gogo, Named_object*, Expression* ret = Expression::make_struct_composite_literal(st, vals, loc); if (!gogo->compiling_runtime() || gogo->package_name() != "runtime") - ret = Expression::make_heap_expression(ret, loc); + { + ret = Expression::make_heap_expression(ret, loc); + Node* n = Node::make_node(this); + if ((n->encoding() & ESCAPE_MASK) == Node::ESCAPE_NONE) + ret->heap_expression()->set_allocate_on_stack(); + } else { // When compiling the runtime, method closures do not escape. -- 2.30.2