mirror of
https://github.com/golang/go.git
synced 2025-05-05 15:43:04 +00: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)
|
r.funcBody(fn)
|
||||||
fn.Dcl = fn.Inl.Dcl
|
fn.Dcl = fn.Inl.Dcl
|
||||||
fn.Body = fn.Inl.Body
|
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
|
fn.Inl = nil
|
||||||
|
|
||||||
ir.FinishCaptureNames(pos, r.curfn, fn)
|
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…
x
Reference in New Issue
Block a user