Skip to content

Commit

Permalink
cmd/compile: import empty closure function correctly
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
danscales committed Mar 1, 2021
1 parent 97bdac0 commit b98ce3b
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 0 deletions.
5 changes: 5 additions & 0 deletions src/cmd/compile/internal/typecheck/iimport.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
21 changes: 21 additions & 0 deletions test/fixedbugs/issue44330.dir/a.go
Original file line number Diff line number Diff line change
@@ -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 changes: 23 additions & 0 deletions test/fixedbugs/issue44330.dir/b.go
Original file line number Diff line number Diff line change
@@ -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 changes: 7 additions & 0 deletions test/fixedbugs/issue44330.go
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit b98ce3b

Please sign in to comment.