aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Scales <danscales@google.com>2021-03-01 09:05:58 -0800
committerDan Scales <danscales@google.com>2021-03-01 20:59:43 +0000
commitb98ce3b606b2bb620c9c62482cd73f068157a32c (patch)
treed064283ac920038f0f16f213294a2282bc85d2eb
parent97bdac03aee805cfa54e7762037a568d85339970 (diff)
downloadgo-b98ce3b606b2bb620c9c62482cd73f068157a32c.tar.gz
go-b98ce3b606b2bb620c9c62482cd73f068157a32c.zip
cmd/compile: import empty closure function correctly
On import, make sure that an empty closure is represented as a single empty block statement. Otherwise, the closure is dropped. Block statements are not exported explicitly, so must recreate on import. Fixes #44330 Change-Id: I061598f0f859dd71d2d0cbd10c77cdd81525d1f2 Reviewed-on: https://go-review.googlesource.com/c/go/+/297569 Run-TryBot: Dan Scales <danscales@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com> Trust: Dan Scales <danscales@google.com>
-rw-r--r--src/cmd/compile/internal/typecheck/iimport.go5
-rw-r--r--test/fixedbugs/issue44330.dir/a.go21
-rw-r--r--test/fixedbugs/issue44330.dir/b.go23
-rw-r--r--test/fixedbugs/issue44330.go7
4 files changed, 56 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/typecheck/iimport.go b/src/cmd/compile/internal/typecheck/iimport.go
index 17aa35549d..9355174da8 100644
--- a/src/cmd/compile/internal/typecheck/iimport.go
+++ b/src/cmd/compile/internal/typecheck/iimport.go
@@ -992,6 +992,11 @@ func (r *importReader) node() ir.Node {
r.funcBody(fn)
fn.Dcl = fn.Inl.Dcl
fn.Body = fn.Inl.Body
+ if len(fn.Body) == 0 {
+ // An empty closure must be represented as a single empty
+ // block statement, else it will be dropped.
+ fn.Body = []ir.Node{ir.NewBlockStmt(src.NoXPos, nil)}
+ }
fn.Inl = nil
ir.FinishCaptureNames(pos, r.curfn, fn)
diff --git a/test/fixedbugs/issue44330.dir/a.go b/test/fixedbugs/issue44330.dir/a.go
new file mode 100644
index 0000000000..9d3ab9fe80
--- /dev/null
+++ b/test/fixedbugs/issue44330.dir/a.go
@@ -0,0 +1,21 @@
+// Copyright 2021 The Go Authors. All rights reserved. Use of this
+// source code is governed by a BSD-style license that can be found in
+// the LICENSE file.
+
+package a
+
+type Table struct {
+ ColumnSeparator bool
+ RowSeparator bool
+
+ // ColumnResizer is called on each Draw. Can be used for custom column sizing.
+ ColumnResizer func()
+}
+
+func NewTable() *Table {
+ return &Table{
+ ColumnSeparator: true,
+ RowSeparator: true,
+ ColumnResizer: func() {},
+ }
+}
diff --git a/test/fixedbugs/issue44330.dir/b.go b/test/fixedbugs/issue44330.dir/b.go
new file mode 100644
index 0000000000..1d5742421b
--- /dev/null
+++ b/test/fixedbugs/issue44330.dir/b.go
@@ -0,0 +1,23 @@
+// Copyright 2021 The Go Authors. All rights reserved. Use of this
+// source code is governed by a BSD-style license that can be found in
+// the LICENSE file.
+
+package main
+
+import (
+ "./a"
+)
+
+type Term struct {
+ top *a.Table
+}
+
+//go:noinline
+func NewFred() *Term {
+ table := a.NewTable()
+ return &Term{top: table}
+}
+
+func main() {
+ NewFred()
+}
diff --git a/test/fixedbugs/issue44330.go b/test/fixedbugs/issue44330.go
new file mode 100644
index 0000000000..682d9c5bf3
--- /dev/null
+++ b/test/fixedbugs/issue44330.go
@@ -0,0 +1,7 @@
+// rundir
+
+// Copyright 2021 The Go Authors. All rights reserved. Use of this
+// source code is governed by a BSD-style license that can be found in
+// the LICENSE file.
+
+package ignored