mirror of
https://github.com/golang/go
synced 2024-11-26 08:17:59 -07:00
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:
parent
97bdac03ae
commit
b98ce3b606
@ -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)
|
||||
|
21
test/fixedbugs/issue44330.dir/a.go
Normal file
21
test/fixedbugs/issue44330.dir/a.go
Normal 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() {},
|
||||
}
|
||||
}
|
23
test/fixedbugs/issue44330.dir/b.go
Normal file
23
test/fixedbugs/issue44330.dir/b.go
Normal 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()
|
||||
}
|
7
test/fixedbugs/issue44330.go
Normal file
7
test/fixedbugs/issue44330.go
Normal 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
|
Loading…
Reference in New Issue
Block a user