1 // Copyright 2022 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 // Field accesses through type parameters are disabled 6 // until we have a more thorough understanding of the 7 // implications on the spec. See issue #51576. 8 9 package p 10 11 type Sf struct { 12 f int 13 } 14 15 func f0[P Sf](p P) { 16 _ = p.f // ERROR "p.f undefined" 17 p.f /* ERROR "p.f undefined" */ = 0 18 } 19 20 func f0t[P ~struct{f int}](p P) { 21 _ = p.f // ERROR "p.f undefined" 22 p.f /* ERROR "p.f undefined" */ = 0 23 } 24 25 var _ = f0[Sf] 26 var _ = f0t[Sf] 27 28 var _ = f0[Sm /* ERROR "does not satisfy" */ ] 29 var _ = f0t[Sm /* ERROR "does not satisfy" */ ] 30 31 func f1[P interface{ Sf; m() }](p P) { 32 _ = p.f // ERROR "p.f undefined" 33 p.f /* ERROR "p.f undefined" */ = 0 34 p.m() 35 } 36 37 var _ = f1[Sf /* ERROR "missing method m" */ ] 38 var _ = f1[Sm /* ERROR "does not satisfy" */ ] 39 40 type Sm struct {} 41 42 func (Sm) m() {} 43 44 type Sfm struct { 45 f int 46 } 47 48 func (Sfm) m() {} 49 50 func f2[P interface{ Sfm; m() }](p P) { 51 _ = p.f // ERROR "p.f undefined" 52 p.f /* ERROR "p.f undefined" */ = 0 53 p.m() 54 } 55 56 var _ = f2[Sfm] 57 58 // special case: core type is a named pointer type 59 60 type PSfm *Sfm 61 62 func f3[P interface{ PSfm }](p P) { 63 _ = p.f // ERROR "p.f undefined" 64 p.f /* ERROR "p.f undefined" */ = 0 65 p.m /* ERROR "type P has no field or method m" */ () 66 } 67 68 var _ = f3[PSfm] 69