|  | // 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 type-checking errors for go:notinheap. | 
|  |  | 
|  | package p | 
|  |  | 
|  | //go:notinheap | 
|  | type nih struct{} | 
|  |  | 
|  | // Types embedding notinheap types must be notinheap. | 
|  |  | 
|  | type embed1 struct { | 
|  | x nih | 
|  | } // ERROR "must be go:notinheap" | 
|  |  | 
|  | type embed2 [1]nih // ERROR "must be go:notinheap" | 
|  |  | 
|  | type embed3 struct { | 
|  | x [1]nih | 
|  | } // ERROR "must be go:notinheap" | 
|  |  | 
|  | type embed4 map[nih]int // ERROR "go:notinheap map key not allowed" | 
|  |  | 
|  | type embed5 map[int]nih // ERROR "go:notinheap map value not allowed" | 
|  |  | 
|  | type emebd6 chan nih // ERROR "chan of go:notinheap type not allowed" | 
|  |  | 
|  | type okay1 *nih | 
|  |  | 
|  | type okay2 []nih | 
|  |  | 
|  | type okay3 func(x nih) nih | 
|  |  | 
|  | type okay4 interface { | 
|  | f(x nih) nih | 
|  | } | 
|  |  | 
|  | // Type conversions don't let you sneak past notinheap. | 
|  |  | 
|  | type t1 struct{ x int } | 
|  |  | 
|  | //go:notinheap | 
|  | type t2 t1 | 
|  |  | 
|  | var sink interface{} | 
|  |  | 
|  | func i() { | 
|  | sink = new(t1)                     // no error | 
|  | sink = (*t2)(new(t1))              // ERROR "cannot convert(.|\n)*t2 is go:notinheap" | 
|  | sink = (*t2)(new(struct{ x int })) // ERROR "cannot convert(.|\n)*t2 is go:notinheap" | 
|  | } |