|  | // 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{} | 
|  |  | 
|  | type embed4 map[nih]int // ERROR "incomplete \(or unallocatable\) map key not allowed" | 
|  |  | 
|  | type embed5 map[int]nih // ERROR "incomplete \(or unallocatable\) map value not allowed" | 
|  |  | 
|  | type emebd6 chan nih // ERROR "chan of incomplete \(or unallocatable\) 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 incomplete \(or unallocatable\)" | 
|  | sink = (*t2)(new(struct{ x int })) // ERROR "cannot convert(.|\n)*t2 is incomplete \(or unallocatable\)" | 
|  | sink = []t3("foo")                 // ERROR "cannot convert(.|\n)*t3 is incomplete \(or unallocatable\)" | 
|  | sink = []t4("bar")                 // ERROR "cannot convert(.|\n)*t4 is incomplete \(or unallocatable\)" | 
|  | } |