Source file src/internal/types/testdata/check/cycles6.go
1 // Copyright 2026 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package p 6 7 import "unsafe" 8 9 // Below are the pieces of syntax corresponding to functions which can produce a 10 // type T without first having a value of type T. Notice that each causes a 11 // value of type T to be passed to unsafe.Sizeof while T is incomplete. 12 13 // literal on type 14 type T0 /* ERROR "invalid recursive type" */ [unsafe.Sizeof(T0{})]int 15 // literal on value (not applicable) 16 // literal on pointer (not applicable) 17 18 // call on type 19 type T1 /* ERROR "invalid recursive type" */ [unsafe.Sizeof(T1(42))]int 20 // call on value 21 func f2() T2 22 type T2 /* ERROR "invalid recursive type" */ [unsafe.Sizeof(f2())]int 23 // call on pointer (not applicable) 24 25 // assert on type 26 var i3 interface{} 27 type T3 /* ERROR "invalid recursive type" */ [unsafe.Sizeof(i3.(T3))]int 28 // assert on value (not applicable) 29 // assert on pointer (not applicable) 30 31 // receive on type (not applicable) 32 // receive on value 33 func f4() <-chan T4 34 type T4 /* ERROR "invalid recursive type" */ [unsafe.Sizeof(<-f4())]int 35 // receive on pointer (not applicable) 36 37 // star on type (not applicable) 38 // star on value (not applicable) 39 // star on pointer 40 func f5() *T5 41 type T5 /* ERROR "invalid recursive type" */ [unsafe.Sizeof(*f5())]int 42 43 // Below is additional syntax which interacts with incomplete types. Notice that 44 // each of the below falls into 1 of 3 cases: 45 // 1. It cannot produce a value of (incomplete) type T. 46 // 2. It can, but only because it already has a value of type T. 47 // 3. It can, but only because it performs an implicit dereference. 48 49 // select on type (case 1) 50 // select on value (case 2) 51 type T6 /* ERROR "invalid recursive type" */ struct { 52 f T7 53 } 54 type T7 [unsafe.Sizeof(T6{}.f)]int 55 // select on pointer (case 3) 56 type T8 /* ERROR "invalid recursive type" */ struct { 57 f T9 58 } 59 type T9 [unsafe.Sizeof(new(T8).f)]int 60 61 // slice on type (not applicable) 62 // slice on value (case 2) 63 type T10 /* ERROR "invalid recursive type" */ [unsafe.Sizeof(T10{}[:])]int 64 // slice on pointer (case 3) 65 type T11 /* ERROR "invalid recursive type" */ [unsafe.Sizeof(new(T11)[:])]int 66 67 // index on type (case 1) 68 // index on value (case 2) 69 type T12 /* ERROR "invalid recursive type" */ [unsafe.Sizeof(T12{}[42])]int 70 // index on pointer (case 3) 71 type T13 /* ERROR "invalid recursive type" */ [unsafe.Sizeof(new(T13)[42])]int 72 // index on map (case 1) 73 type T14 /* ERROR "invalid recursive type" */ [unsafe.Sizeof((*new(map[int]T14))[42])]int 74