cmd/compile: ensure stenciled function bodies are nonempty

Our compiler gets confused between functions that were declared
with no body, and those which have a body but it is empty.

Ensure that when stenciling, we generate a nonempty body.

The particular test that causes this problem is in
cmd/compile/internal/gc/main.go:enqueueFunc. It thinks that if
a function has no body, then we need to generate ABI wrappers for
it, but not compile it.

Fixes #49524

Change-Id: Id962666a2098f60a2421484b6a776eafdc4f4a63
Reviewed-on: https://go-review.googlesource.com/c/go/+/363395
Trust: Keith Randall <khr@golang.org>
Trust: Dan Scales <danscales@google.com>
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Dan Scales <danscales@google.com>
This commit is contained in:
Keith Randall 2021-11-11 08:45:02 -08:00
parent c622d1d3f6
commit 10d3b13551
4 changed files with 32 additions and 0 deletions

View file

@ -802,6 +802,12 @@ func (g *genInst) genericSubst(newsym *types.Sym, nameNode *ir.Name, shapes []*t
// Make sure name/type of newf is set before substituting the body.
newf.Body = subst.list(gf.Body)
if len(newf.Body) == 0 {
// Ensure the body is nonempty, for issue 49524.
// TODO: have some other way to detect the difference between
// a function declared with no body, vs. one with an empty body?
newf.Body = append(newf.Body, ir.NewBlockStmt(gf.Pos(), nil))
}
if len(subst.defnMap) > 0 {
base.Fatalf("defnMap is not empty")

View file

@ -0,0 +1,8 @@
// 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
func F[T any]() {
}

View file

@ -0,0 +1,11 @@
package main
// 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.
import "a"
func main() {
a.F[int]()
}

View file

@ -0,0 +1,7 @@
// rundir -G=3
// 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