]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.15] cmd/compile: allow aliases to go:notinheap types
authorKeith Randall <khr@golang.org>
Wed, 26 Aug 2020 21:07:35 +0000 (14:07 -0700)
committerDmitri Shuralyov <dmitshur@golang.org>
Fri, 9 Oct 2020 17:24:56 +0000 (17:24 +0000)
The alias doesn't need to be marked go:notinheap. It gets its
notinheap-ness from the target type.

Without this change, the type alias test in the notinheap.go file
generates these two errors:

notinheap.go:62: misplaced compiler directive
notinheap.go:63: type nih must be go:notinheap

The first is a result of go:notinheap pragmas not applying
to type alias declarations.
The second is the result of then trying to match the notinheap-ness
of the alias and the target type.

Add a few more go:notinheap tests while we are here.

Update #40954

Change-Id: I067ec47698df6e9e593e080d67796fd05a1d480f
Reviewed-on: https://go-review.googlesource.com/c/go/+/250939
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Emmanuel Odeke <emm.odeke@gmail.com>
Trust: Keith Randall <khr@golang.org>
Reviewed-on: https://go-review.googlesource.com/c/go/+/255337
Trust: Emmanuel Odeke <emm.odeke@gmail.com>
Reviewed-by: Austin Clements <austin@google.com>
src/cmd/compile/internal/gc/typecheck.go
test/notinheap.go
test/notinheap2.go

index dec4b96fc4cd8f25b4f8a09ded3c2186c57eec62..b29f5ef5ec7eb86ab9a329e0f2c838b73a0354e5 100644 (file)
@@ -2068,7 +2068,7 @@ func typecheck1(n *Node, top int) (res *Node) {
                ok |= ctxStmt
                n.Left = typecheck(n.Left, ctxType)
                checkwidth(n.Left.Type)
-               if n.Left.Type != nil && n.Left.Type.NotInHeap() && n.Left.Name.Param.Pragma&NotInHeap == 0 {
+               if n.Left.Type != nil && n.Left.Type.NotInHeap() && !n.Left.Name.Param.Alias && n.Left.Name.Param.Pragma&NotInHeap == 0 {
                        // The type contains go:notinheap types, so it
                        // must be marked as such (alternatively, we
                        // could silently propagate go:notinheap).
index 16c3f8faf0a6735fef025e5a142cbb32ff340fda..a2284a50689c21b647e95392ecf1b6df2f6a504b 100644 (file)
@@ -52,6 +52,14 @@ type t3 byte
 //go:notinheap
 type t4 rune
 
+// Type aliases inherit the go:notinheap-ness of the type they alias.
+type nihAlias = nih
+
+type embedAlias1 struct { // ERROR "must be go:notinheap"
+       x nihAlias
+}
+type embedAlias2 [1]nihAlias // ERROR "must be go:notinheap"
+
 var sink interface{}
 
 func i() {
index de1e6db1d31a05af50c0864bb114fe0042d3224e..09d0fc0b7b665d80abb8fa238316110e2fff0670 100644 (file)
@@ -27,14 +27,18 @@ func f() {
 // Heap allocation is not okay.
 
 var y *nih
+var y2 *struct{ x nih }
+var y3 *[1]nih
 var z []nih
 var w []nih
 var n int
 
 func g() {
-       y = new(nih)       // ERROR "heap allocation disallowed"
-       z = make([]nih, 1) // ERROR "heap allocation disallowed"
-       z = append(z, x)   // ERROR "heap allocation disallowed"
+       y = new(nih)              // ERROR "heap allocation disallowed"
+       y2 = new(struct{ x nih }) // ERROR "heap allocation disallowed"
+       y3 = new([1]nih)          // ERROR "heap allocation disallowed"
+       z = make([]nih, 1)        // ERROR "heap allocation disallowed"
+       z = append(z, x)          // ERROR "heap allocation disallowed"
        // Test for special case of OMAKESLICECOPY
        x := make([]nih, n) // ERROR "heap allocation disallowed"
        copy(x, z)