]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: ensure stenciled function bodies are nonempty
authorKeith Randall <khr@golang.org>
Thu, 11 Nov 2021 16:45:02 +0000 (08:45 -0800)
committerKeith Randall <khr@golang.org>
Thu, 11 Nov 2021 20:34:56 +0000 (20:34 +0000)
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>
src/cmd/compile/internal/noder/stencil.go
test/typeparam/issue49524.dir/a.go [new file with mode: 0644]
test/typeparam/issue49524.dir/main.go [new file with mode: 0644]
test/typeparam/issue49524.go [new file with mode: 0644]

index c8c5d80cfc4ad5ad250722783ac855f6752ef640..20197565f544af8acf13c3aa3064375d7dac9254 100644 (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")
diff --git a/test/typeparam/issue49524.dir/a.go b/test/typeparam/issue49524.dir/a.go
new file mode 100644 (file)
index 0000000..f40075e
--- /dev/null
@@ -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]() {
+}
diff --git a/test/typeparam/issue49524.dir/main.go b/test/typeparam/issue49524.dir/main.go
new file mode 100644 (file)
index 0000000..ef00c8a
--- /dev/null
@@ -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]()
+}
diff --git a/test/typeparam/issue49524.go b/test/typeparam/issue49524.go
new file mode 100644 (file)
index 0000000..76930e5
--- /dev/null
@@ -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