]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: import empty closure function correctly
authorDan Scales <danscales@google.com>
Mon, 1 Mar 2021 17:05:58 +0000 (09:05 -0800)
committerDan Scales <danscales@google.com>
Mon, 1 Mar 2021 20:59:43 +0000 (20:59 +0000)
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>

src/cmd/compile/internal/typecheck/iimport.go
test/fixedbugs/issue44330.dir/a.go [new file with mode: 0644]
test/fixedbugs/issue44330.dir/b.go [new file with mode: 0644]
test/fixedbugs/issue44330.go [new file with mode: 0644]

index 17aa35549db4b6a03d656c9bc8525d792c9f14e8..9355174da89b84b85468983273598f40562bc225 100644 (file)
@@ -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 (file)
index 0000000..9d3ab9f
--- /dev/null
@@ -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 (file)
index 0000000..1d57424
--- /dev/null
@@ -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 (file)
index 0000000..682d9c5
--- /dev/null
@@ -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