mirror of
https://github.com/golang/go
synced 2024-11-15 01:20:28 -07:00
cfeb16ddec
//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 22053790fa
)
Reviewed-on: https://go-review.googlesource.com/c/go/+/255697
Trust: Keith Randall <khr@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
82 lines
1.8 KiB
Go
82 lines
1.8 KiB
Go
// errorcheck -+
|
|
|
|
// Copyright 2016 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// Test walk errors for go:notinheap.
|
|
|
|
package p
|
|
|
|
//go:notinheap
|
|
type nih struct {
|
|
next *nih
|
|
}
|
|
|
|
// Global variables are okay.
|
|
|
|
var x nih
|
|
|
|
// Stack variables are not okay.
|
|
|
|
func f() {
|
|
var y nih // ERROR "nih is incomplete \(or unallocatable\); stack allocation disallowed"
|
|
x = y
|
|
}
|
|
|
|
// 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
|
|
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"
|
|
y2 = new(struct{ x nih }) // ERROR "can't be allocated in Go"
|
|
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)
|
|
z = x
|
|
}
|
|
|
|
// Writes don't produce write barriers.
|
|
|
|
var p *nih
|
|
|
|
//go:nowritebarrier
|
|
func h() {
|
|
y.next = p.next
|
|
}
|