mirror of
https://github.com/golang/go
synced 2024-11-13 14:10:22 -07:00
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>
This commit is contained in:
parent
16328513bf
commit
4f915911e8
@ -2068,7 +2068,7 @@ func typecheck1(n *Node, top int) (res *Node) {
|
|||||||
ok |= ctxStmt
|
ok |= ctxStmt
|
||||||
n.Left = typecheck(n.Left, ctxType)
|
n.Left = typecheck(n.Left, ctxType)
|
||||||
checkwidth(n.Left.Type)
|
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
|
// The type contains go:notinheap types, so it
|
||||||
// must be marked as such (alternatively, we
|
// must be marked as such (alternatively, we
|
||||||
// could silently propagate go:notinheap).
|
// could silently propagate go:notinheap).
|
||||||
|
@ -52,6 +52,14 @@ type t3 byte
|
|||||||
//go:notinheap
|
//go:notinheap
|
||||||
type t4 rune
|
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{}
|
var sink interface{}
|
||||||
|
|
||||||
func i() {
|
func i() {
|
||||||
|
@ -27,14 +27,18 @@ func f() {
|
|||||||
// Heap allocation is not okay.
|
// Heap allocation is not okay.
|
||||||
|
|
||||||
var y *nih
|
var y *nih
|
||||||
|
var y2 *struct{ x nih }
|
||||||
|
var y3 *[1]nih
|
||||||
var z []nih
|
var z []nih
|
||||||
var w []nih
|
var w []nih
|
||||||
var n int
|
var n int
|
||||||
|
|
||||||
func g() {
|
func g() {
|
||||||
y = new(nih) // ERROR "heap allocation disallowed"
|
y = new(nih) // ERROR "heap allocation disallowed"
|
||||||
z = make([]nih, 1) // ERROR "heap allocation disallowed"
|
y2 = new(struct{ x nih }) // ERROR "heap allocation disallowed"
|
||||||
z = append(z, x) // 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
|
// Test for special case of OMAKESLICECOPY
|
||||||
x := make([]nih, n) // ERROR "heap allocation disallowed"
|
x := make([]nih, n) // ERROR "heap allocation disallowed"
|
||||||
copy(x, z)
|
copy(x, z)
|
||||||
|
Loading…
Reference in New Issue
Block a user