Skip to content

Commit

Permalink
[release-branch.go1.15] cmd/compile: allow aliases to go:notinheap types
Browse files Browse the repository at this point in the history
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 golang#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>
  • Loading branch information
randall77 authored and claucece committed Oct 22, 2020
1 parent 983b5bd commit 35eae46
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 4 deletions.
2 changes: 1 addition & 1 deletion src/cmd/compile/internal/gc/typecheck.go
Original file line number Diff line number Diff line change
Expand Up @@ -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).
Expand Down
8 changes: 8 additions & 0 deletions test/notinheap.go
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down
10 changes: 7 additions & 3 deletions test/notinheap2.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 35eae46

Please sign in to comment.