]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.15] cmd/compile: propagate go:notinheap implicitly
authorKeith Randall <khr@golang.org>
Thu, 17 Sep 2020 16:55:23 +0000 (09:55 -0700)
committerDmitri Shuralyov <dmitshur@golang.org>
Fri, 9 Oct 2020 17:25:48 +0000 (17:25 +0000)
//go:notinheap
type T int

type U T

We already correctly propagate the notinheap-ness of T to U.  But we
have an assertion in the typechecker that if there's no explicit
//go:notinheap associated with U, then report an error. Get rid of
that error so that implicit propagation is allowed.

Adjust the tests so that we make sure that uses of types like U
do correctly report an error when U is used in a context that might
cause a Go heap allocation.

Update #41432

Change-Id: I1692bc7cceff21ebb3f557f3748812a40887118d
Reviewed-on: https://go-review.googlesource.com/c/go/+/255637
Run-TryBot: Keith Randall <khr@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Trust: Cuong Manh Le <cuong.manhle.vn@gmail.com>
TryBot-Result: Go Bot <gobot@golang.org>
(cherry picked from commit 22053790fa2c0944df53ea95df476ad2f855424f)
Reviewed-on: https://go-review.googlesource.com/c/go/+/255697
Trust: Keith Randall <khr@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
src/cmd/compile/internal/gc/typecheck.go
test/notinheap.go
test/notinheap2.go

index 56a03f19318cbef6a50af25b551eab4225e3a831..98b52a506afc98f18d9150b9ec8d78e41fe42e47 100644 (file)
@@ -2068,12 +2068,6 @@ 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.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).
-                       yyerror("type %v must be go:notinheap", n.Left.Type)
-               }
        }
 
        t := n.Type
index 5dd4997a6572daf7449a2f37f3a4d24dee099ef1..2188a38a143c14f9916c5b4fd9672e5974559608 100644 (file)
@@ -11,18 +11,6 @@ package p
 //go:notinheap
 type nih struct{}
 
-// Types embedding notinheap types must be notinheap.
-
-type embed1 struct { // ERROR "must be go:notinheap"
-       x nih
-}
-
-type embed2 [1]nih // ERROR "must be go:notinheap"
-
-type embed3 struct { // ERROR "must be go:notinheap"
-       x [1]nih
-}
-
 type embed4 map[nih]int // ERROR "incomplete \(or unallocatable\) map key not allowed"
 
 type embed5 map[int]nih // ERROR "incomplete \(or unallocatable\) map value not allowed"
@@ -52,14 +40,6 @@ 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 23d4b0ae77469a0c6fda6886adc40f76daac8d7e..100ed37b7218ad2ce8604fa13675db3bf9fa2ee2 100644 (file)
@@ -32,6 +32,25 @@ var y3 *[1]nih
 var z []nih
 var w []nih
 var n int
+var sink interface{}
+
+type embed1 struct { // implicitly notinheap
+       x nih
+}
+
+type embed2 [1]nih // implicitly notinheap
+
+type embed3 struct { // implicitly notinheap
+       x [1]nih
+}
+
+// Type aliases inherit the go:notinheap-ness of the type they alias.
+type nihAlias = nih
+
+type embedAlias1 struct { // implicitly notinheap
+       x nihAlias
+}
+type embedAlias2 [1]nihAlias // implicitly notinheap
 
 func g() {
        y = new(nih)              // ERROR "can't be allocated in Go"
@@ -39,6 +58,13 @@ func g() {
        y3 = new([1]nih)          // ERROR "can't be allocated in Go"
        z = make([]nih, 1)        // ERROR "can't be allocated in Go"
        z = append(z, x)          // ERROR "can't be allocated in Go"
+
+       sink = new(embed1)      // ERROR "can't be allocated in Go"
+       sink = new(embed2)      // ERROR "can't be allocated in Go"
+       sink = new(embed3)      // ERROR "can't be allocated in Go"
+       sink = new(embedAlias1) // ERROR "can't be allocated in Go"
+       sink = new(embedAlias2) // ERROR "can't be allocated in Go"
+
        // Test for special case of OMAKESLICECOPY
        x := make([]nih, n) // ERROR "can't be allocated in Go"
        copy(x, z)