| // 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 not-in-heap. |
| |
| //go:build cgo |
| |
| package p |
| |
| import "runtime/cgo" |
| |
| type nih struct { |
| _ cgo.Incomplete |
| 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 |
| } |