1*88d15eacSSasha Smundak// Copyright 2017, The Go Authors. All rights reserved. 2*88d15eacSSasha Smundak// Use of this source code is governed by a BSD-style 3*88d15eacSSasha Smundak// license that can be found in the LICENSE file. 4*88d15eacSSasha Smundak 5*88d15eacSSasha Smundakpackage teststructs 6*88d15eacSSasha Smundak 7*88d15eacSSasha Smundaktype InterfaceA interface { 8*88d15eacSSasha Smundak InterfaceA() 9*88d15eacSSasha Smundak} 10*88d15eacSSasha Smundak 11*88d15eacSSasha Smundaktype ( 12*88d15eacSSasha Smundak StructA struct{ X string } // Equal method on value receiver 13*88d15eacSSasha Smundak StructB struct{ X string } // Equal method on pointer receiver 14*88d15eacSSasha Smundak StructC struct{ X string } // Equal method (with interface argument) on value receiver 15*88d15eacSSasha Smundak StructD struct{ X string } // Equal method (with interface argument) on pointer receiver 16*88d15eacSSasha Smundak StructE struct{ X string } // Equal method (with interface argument on value receiver) on pointer receiver 17*88d15eacSSasha Smundak StructF struct{ X string } // Equal method (with interface argument on pointer receiver) on value receiver 18*88d15eacSSasha Smundak 19*88d15eacSSasha Smundak // These embed the above types as a value. 20*88d15eacSSasha Smundak StructA1 struct { 21*88d15eacSSasha Smundak StructA 22*88d15eacSSasha Smundak X string 23*88d15eacSSasha Smundak } 24*88d15eacSSasha Smundak StructB1 struct { 25*88d15eacSSasha Smundak StructB 26*88d15eacSSasha Smundak X string 27*88d15eacSSasha Smundak } 28*88d15eacSSasha Smundak StructC1 struct { 29*88d15eacSSasha Smundak StructC 30*88d15eacSSasha Smundak X string 31*88d15eacSSasha Smundak } 32*88d15eacSSasha Smundak StructD1 struct { 33*88d15eacSSasha Smundak StructD 34*88d15eacSSasha Smundak X string 35*88d15eacSSasha Smundak } 36*88d15eacSSasha Smundak StructE1 struct { 37*88d15eacSSasha Smundak StructE 38*88d15eacSSasha Smundak X string 39*88d15eacSSasha Smundak } 40*88d15eacSSasha Smundak StructF1 struct { 41*88d15eacSSasha Smundak StructF 42*88d15eacSSasha Smundak X string 43*88d15eacSSasha Smundak } 44*88d15eacSSasha Smundak 45*88d15eacSSasha Smundak // These embed the above types as a pointer. 46*88d15eacSSasha Smundak StructA2 struct { 47*88d15eacSSasha Smundak *StructA 48*88d15eacSSasha Smundak X string 49*88d15eacSSasha Smundak } 50*88d15eacSSasha Smundak StructB2 struct { 51*88d15eacSSasha Smundak *StructB 52*88d15eacSSasha Smundak X string 53*88d15eacSSasha Smundak } 54*88d15eacSSasha Smundak StructC2 struct { 55*88d15eacSSasha Smundak *StructC 56*88d15eacSSasha Smundak X string 57*88d15eacSSasha Smundak } 58*88d15eacSSasha Smundak StructD2 struct { 59*88d15eacSSasha Smundak *StructD 60*88d15eacSSasha Smundak X string 61*88d15eacSSasha Smundak } 62*88d15eacSSasha Smundak StructE2 struct { 63*88d15eacSSasha Smundak *StructE 64*88d15eacSSasha Smundak X string 65*88d15eacSSasha Smundak } 66*88d15eacSSasha Smundak StructF2 struct { 67*88d15eacSSasha Smundak *StructF 68*88d15eacSSasha Smundak X string 69*88d15eacSSasha Smundak } 70*88d15eacSSasha Smundak 71*88d15eacSSasha Smundak StructNo struct{ X string } // Equal method (with interface argument) on non-satisfying receiver 72*88d15eacSSasha Smundak 73*88d15eacSSasha Smundak AssignA func() int 74*88d15eacSSasha Smundak AssignB struct{ A int } 75*88d15eacSSasha Smundak AssignC chan bool 76*88d15eacSSasha Smundak AssignD <-chan bool 77*88d15eacSSasha Smundak) 78*88d15eacSSasha Smundak 79*88d15eacSSasha Smundakfunc (x StructA) Equal(y StructA) bool { return true } 80*88d15eacSSasha Smundakfunc (x *StructB) Equal(y *StructB) bool { return true } 81*88d15eacSSasha Smundakfunc (x StructC) Equal(y InterfaceA) bool { return true } 82*88d15eacSSasha Smundakfunc (x StructC) InterfaceA() {} 83*88d15eacSSasha Smundakfunc (x *StructD) Equal(y InterfaceA) bool { return true } 84*88d15eacSSasha Smundakfunc (x *StructD) InterfaceA() {} 85*88d15eacSSasha Smundakfunc (x *StructE) Equal(y InterfaceA) bool { return true } 86*88d15eacSSasha Smundakfunc (x StructE) InterfaceA() {} 87*88d15eacSSasha Smundakfunc (x StructF) Equal(y InterfaceA) bool { return true } 88*88d15eacSSasha Smundakfunc (x *StructF) InterfaceA() {} 89*88d15eacSSasha Smundakfunc (x StructNo) Equal(y InterfaceA) bool { return true } 90*88d15eacSSasha Smundak 91*88d15eacSSasha Smundakfunc (x AssignA) Equal(y func() int) bool { return true } 92*88d15eacSSasha Smundakfunc (x AssignB) Equal(y struct{ A int }) bool { return true } 93*88d15eacSSasha Smundakfunc (x AssignC) Equal(y chan bool) bool { return true } 94*88d15eacSSasha Smundakfunc (x AssignD) Equal(y <-chan bool) bool { return true } 95*88d15eacSSasha Smundak 96*88d15eacSSasha Smundakvar _ = func( 97*88d15eacSSasha Smundak a StructA, b StructB, c StructC, d StructD, e StructE, f StructF, 98*88d15eacSSasha Smundak ap *StructA, bp *StructB, cp *StructC, dp *StructD, ep *StructE, fp *StructF, 99*88d15eacSSasha Smundak a1 StructA1, b1 StructB1, c1 StructC1, d1 StructD1, e1 StructE1, f1 StructF1, 100*88d15eacSSasha Smundak a2 StructA2, b2 StructB2, c2 StructC2, d2 StructD2, e2 StructE2, f2 StructF1, 101*88d15eacSSasha Smundak) { 102*88d15eacSSasha Smundak a.Equal(a) 103*88d15eacSSasha Smundak b.Equal(&b) 104*88d15eacSSasha Smundak c.Equal(c) 105*88d15eacSSasha Smundak d.Equal(&d) 106*88d15eacSSasha Smundak e.Equal(e) 107*88d15eacSSasha Smundak f.Equal(&f) 108*88d15eacSSasha Smundak 109*88d15eacSSasha Smundak ap.Equal(*ap) 110*88d15eacSSasha Smundak bp.Equal(bp) 111*88d15eacSSasha Smundak cp.Equal(*cp) 112*88d15eacSSasha Smundak dp.Equal(dp) 113*88d15eacSSasha Smundak ep.Equal(*ep) 114*88d15eacSSasha Smundak fp.Equal(fp) 115*88d15eacSSasha Smundak 116*88d15eacSSasha Smundak a1.Equal(a1.StructA) 117*88d15eacSSasha Smundak b1.Equal(&b1.StructB) 118*88d15eacSSasha Smundak c1.Equal(c1) 119*88d15eacSSasha Smundak d1.Equal(&d1) 120*88d15eacSSasha Smundak e1.Equal(e1) 121*88d15eacSSasha Smundak f1.Equal(&f1) 122*88d15eacSSasha Smundak 123*88d15eacSSasha Smundak a2.Equal(*a2.StructA) 124*88d15eacSSasha Smundak b2.Equal(b2.StructB) 125*88d15eacSSasha Smundak c2.Equal(c2) 126*88d15eacSSasha Smundak d2.Equal(&d2) 127*88d15eacSSasha Smundak e2.Equal(e2) 128*88d15eacSSasha Smundak f2.Equal(&f2) 129*88d15eacSSasha Smundak} 130*88d15eacSSasha Smundak 131*88d15eacSSasha Smundaktype ( 132*88d15eacSSasha Smundak privateStruct struct{ Public, private int } 133*88d15eacSSasha Smundak PublicStruct struct{ Public, private int } 134*88d15eacSSasha Smundak ParentStructA struct{ privateStruct } 135*88d15eacSSasha Smundak ParentStructB struct{ PublicStruct } 136*88d15eacSSasha Smundak ParentStructC struct { 137*88d15eacSSasha Smundak privateStruct 138*88d15eacSSasha Smundak Public, private int 139*88d15eacSSasha Smundak } 140*88d15eacSSasha Smundak ParentStructD struct { 141*88d15eacSSasha Smundak PublicStruct 142*88d15eacSSasha Smundak Public, private int 143*88d15eacSSasha Smundak } 144*88d15eacSSasha Smundak ParentStructE struct { 145*88d15eacSSasha Smundak privateStruct 146*88d15eacSSasha Smundak PublicStruct 147*88d15eacSSasha Smundak } 148*88d15eacSSasha Smundak ParentStructF struct { 149*88d15eacSSasha Smundak privateStruct 150*88d15eacSSasha Smundak PublicStruct 151*88d15eacSSasha Smundak Public, private int 152*88d15eacSSasha Smundak } 153*88d15eacSSasha Smundak ParentStructG struct { 154*88d15eacSSasha Smundak *privateStruct 155*88d15eacSSasha Smundak } 156*88d15eacSSasha Smundak ParentStructH struct { 157*88d15eacSSasha Smundak *PublicStruct 158*88d15eacSSasha Smundak } 159*88d15eacSSasha Smundak ParentStructI struct { 160*88d15eacSSasha Smundak *privateStruct 161*88d15eacSSasha Smundak *PublicStruct 162*88d15eacSSasha Smundak } 163*88d15eacSSasha Smundak ParentStructJ struct { 164*88d15eacSSasha Smundak *privateStruct 165*88d15eacSSasha Smundak *PublicStruct 166*88d15eacSSasha Smundak Public PublicStruct 167*88d15eacSSasha Smundak private privateStruct 168*88d15eacSSasha Smundak } 169*88d15eacSSasha Smundak) 170*88d15eacSSasha Smundak 171*88d15eacSSasha Smundakfunc NewParentStructG() *ParentStructG { 172*88d15eacSSasha Smundak return &ParentStructG{new(privateStruct)} 173*88d15eacSSasha Smundak} 174*88d15eacSSasha Smundakfunc NewParentStructH() *ParentStructH { 175*88d15eacSSasha Smundak return &ParentStructH{new(PublicStruct)} 176*88d15eacSSasha Smundak} 177*88d15eacSSasha Smundakfunc NewParentStructI() *ParentStructI { 178*88d15eacSSasha Smundak return &ParentStructI{new(privateStruct), new(PublicStruct)} 179*88d15eacSSasha Smundak} 180*88d15eacSSasha Smundakfunc NewParentStructJ() *ParentStructJ { 181*88d15eacSSasha Smundak return &ParentStructJ{ 182*88d15eacSSasha Smundak privateStruct: new(privateStruct), PublicStruct: new(PublicStruct), 183*88d15eacSSasha Smundak } 184*88d15eacSSasha Smundak} 185*88d15eacSSasha Smundakfunc (s *privateStruct) SetPrivate(i int) { s.private = i } 186*88d15eacSSasha Smundakfunc (s *PublicStruct) SetPrivate(i int) { s.private = i } 187*88d15eacSSasha Smundakfunc (s *ParentStructC) SetPrivate(i int) { s.private = i } 188*88d15eacSSasha Smundakfunc (s *ParentStructD) SetPrivate(i int) { s.private = i } 189*88d15eacSSasha Smundakfunc (s *ParentStructF) SetPrivate(i int) { s.private = i } 190*88d15eacSSasha Smundakfunc (s *ParentStructA) PrivateStruct() *privateStruct { return &s.privateStruct } 191*88d15eacSSasha Smundakfunc (s *ParentStructC) PrivateStruct() *privateStruct { return &s.privateStruct } 192*88d15eacSSasha Smundakfunc (s *ParentStructE) PrivateStruct() *privateStruct { return &s.privateStruct } 193*88d15eacSSasha Smundakfunc (s *ParentStructF) PrivateStruct() *privateStruct { return &s.privateStruct } 194*88d15eacSSasha Smundakfunc (s *ParentStructG) PrivateStruct() *privateStruct { return s.privateStruct } 195*88d15eacSSasha Smundakfunc (s *ParentStructI) PrivateStruct() *privateStruct { return s.privateStruct } 196*88d15eacSSasha Smundakfunc (s *ParentStructJ) PrivateStruct() *privateStruct { return s.privateStruct } 197*88d15eacSSasha Smundakfunc (s *ParentStructJ) Private() *privateStruct { return &s.private } 198