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>
This commit is contained in:
Dan Scales 2021-03-01 09:05:58 -08:00
parent 97bdac03ae
commit b98ce3b606
4 changed files with 56 additions and 0 deletions

View 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)

View file

@ -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() {},
}
}

View file

@ -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()
}

View file

@ -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