| // 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 { // ERROR "must be go:notinheap" | 
 | 	x nih | 
 | } | 
 |  | 
 | type embed2 [1]nih // ERROR "must be go:notinheap" | 
 |  | 
 | type embed3 struct { // ERROR "must be go:notinheap" | 
 | 	x [1]nih | 
 | } | 
 |  | 
 | 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 | 
 |  | 
 | //go:notinheap | 
 | type t3 byte | 
 |  | 
 | //go:notinheap | 
 | type t4 rune | 
 |  | 
 | 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" | 
 | 	sink = []t3("foo")                 // ERROR "cannot convert(.|\n)*t3 is go:notinheap" | 
 | 	sink = []t4("bar")                 // ERROR "cannot convert(.|\n)*t4 is go:notinheap" | 
 | } |