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 implement */ ]
29 var _ = f0t[Sm /* ERROR does not implement */ ]
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 implement */ ]
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
View as plain text