]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: propagate pragmas from generic function to stenciled implementation
authorKeith Randall <khr@golang.org>
Wed, 14 Apr 2021 23:18:58 +0000 (16:18 -0700)
committerKeith Randall <khr@golang.org>
Thu, 15 Apr 2021 00:29:05 +0000 (00:29 +0000)
Change-Id: I28a1910890659aaa449ffd2a847cd4ced5a8600d
Reviewed-on: https://go-review.googlesource.com/c/go/+/310211
Trust: Keith Randall <khr@golang.org>
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/pragma.go [new file with mode: 0644]

index 2745016545af0355dc8d04ca93e8505e9b48f37f..53ac617d12761cc9cfd2c03186c2b8634db66b49 100644 (file)
@@ -270,6 +270,7 @@ func (g *irgen) genericSubst(newsym *types.Sym, nameNode *ir.Name, targs []ir.No
        gf := nameNode.Func
        // Pos of the instantiated function is same as the generic function
        newf := ir.NewFunc(gf.Pos())
+       newf.Pragma = gf.Pragma // copy over pragmas from generic function to stenciled implementation.
        newf.Nname = ir.NewNameAt(gf.Pos(), newsym)
        newf.Nname.Func = newf
        newf.Nname.Defn = newf
diff --git a/test/typeparam/pragma.go b/test/typeparam/pragma.go
new file mode 100644 (file)
index 0000000..6743e24
--- /dev/null
@@ -0,0 +1,19 @@
+// errorcheck -0 -m -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.
+
+// Make sure the go:noinline pragma makes it from a
+// generic function to any of its stenciled instances.
+
+package main
+
+//go:noinline
+func f[T any](x T) T {
+       return x
+}
+
+func main() { // ERROR "can inline main"
+       println(f(5))
+}