aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Randall <khr@golang.org>2020-08-26 14:07:35 -0700
committerDmitri Shuralyov <dmitshur@golang.org>2020-10-09 17:24:56 +0000
commit142027888a7d3da0494d77581166f1d120317864 (patch)
tree37196f75d5bb7ab5af28e2ff13b2f2ea33d2d7df
parent439ce71eb6a472c5f758021a92f06d8489ca0689 (diff)
downloadgo-142027888a7d3da0494d77581166f1d120317864.tar.gz
go-142027888a7d3da0494d77581166f1d120317864.zip
[release-branch.go1.15] cmd/compile: allow aliases to go:notinheap types
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>
-rw-r--r--src/cmd/compile/internal/gc/typecheck.go2
-rw-r--r--test/notinheap.go8
-rw-r--r--test/notinheap2.go10
3 files changed, 16 insertions, 4 deletions
diff --git a/src/cmd/compile/internal/gc/typecheck.go b/src/cmd/compile/internal/gc/typecheck.go
index dec4b96fc4..b29f5ef5ec 100644
--- a/src/cmd/compile/internal/gc/typecheck.go
+++ b/src/cmd/compile/internal/gc/typecheck.go
@@ -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).
diff --git a/test/notinheap.go b/test/notinheap.go
index 16c3f8faf0..a2284a5068 100644
--- a/test/notinheap.go
+++ b/test/notinheap.go
@@ -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() {
diff --git a/test/notinheap2.go b/test/notinheap2.go
index de1e6db1d3..09d0fc0b7b 100644
--- a/test/notinheap2.go
+++ b/test/notinheap2.go
@@ -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)