Austin Clements | 77527a3 | 2016-10-11 22:53:27 -0400 | [diff] [blame] | 1 | // errorcheck -+ |
| 2 | |
| 3 | // Copyright 2016 The Go Authors. All rights reserved. |
| 4 | // Use of this source code is governed by a BSD-style |
| 5 | // license that can be found in the LICENSE file. |
| 6 | |
| 7 | // Test type-checking errors for go:notinheap. |
| 8 | |
| 9 | package p |
| 10 | |
| 11 | //go:notinheap |
| 12 | type nih struct{} |
| 13 | |
| 14 | // Types embedding notinheap types must be notinheap. |
| 15 | |
Matthew Dempsky | a27b781 | 2017-02-01 12:35:53 -0800 | [diff] [blame^] | 16 | type embed1 struct { // ERROR "must be go:notinheap" |
Austin Clements | 77527a3 | 2016-10-11 22:53:27 -0400 | [diff] [blame] | 17 | x nih |
Matthew Dempsky | a27b781 | 2017-02-01 12:35:53 -0800 | [diff] [blame^] | 18 | } |
Austin Clements | 77527a3 | 2016-10-11 22:53:27 -0400 | [diff] [blame] | 19 | |
| 20 | type embed2 [1]nih // ERROR "must be go:notinheap" |
| 21 | |
Matthew Dempsky | a27b781 | 2017-02-01 12:35:53 -0800 | [diff] [blame^] | 22 | type embed3 struct { // ERROR "must be go:notinheap" |
Austin Clements | 77527a3 | 2016-10-11 22:53:27 -0400 | [diff] [blame] | 23 | x [1]nih |
Matthew Dempsky | a27b781 | 2017-02-01 12:35:53 -0800 | [diff] [blame^] | 24 | } |
Austin Clements | 77527a3 | 2016-10-11 22:53:27 -0400 | [diff] [blame] | 25 | |
| 26 | type embed4 map[nih]int // ERROR "go:notinheap map key not allowed" |
| 27 | |
| 28 | type embed5 map[int]nih // ERROR "go:notinheap map value not allowed" |
| 29 | |
| 30 | type emebd6 chan nih // ERROR "chan of go:notinheap type not allowed" |
| 31 | |
| 32 | type okay1 *nih |
| 33 | |
| 34 | type okay2 []nih |
| 35 | |
| 36 | type okay3 func(x nih) nih |
| 37 | |
| 38 | type okay4 interface { |
| 39 | f(x nih) nih |
| 40 | } |
| 41 | |
| 42 | // Type conversions don't let you sneak past notinheap. |
| 43 | |
| 44 | type t1 struct{ x int } |
| 45 | |
| 46 | //go:notinheap |
| 47 | type t2 t1 |
| 48 | |
| 49 | var sink interface{} |
| 50 | |
| 51 | func i() { |
| 52 | sink = new(t1) // no error |
| 53 | sink = (*t2)(new(t1)) // ERROR "cannot convert(.|\n)*t2 is go:notinheap" |
| 54 | sink = (*t2)(new(struct{ x int })) // ERROR "cannot convert(.|\n)*t2 is go:notinheap" |
| 55 | } |