github.com/go-asm/go@v1.21.1-0.20240213172139-40c5ead50c48/types/testdata/check/decls3.go (about)

     1  // Copyright 2012 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  // embedded types
     6  
     7  package decls3
     8  
     9  import "unsafe"
    10  import "fmt"
    11  
    12  // fields with the same name at the same level cancel each other out
    13  
    14  func _() {
    15  	type (
    16  		T1 struct { X int }
    17  		T2 struct { X int }
    18  		T3 struct { T1; T2 } // X is embedded twice at the same level via T1->X, T2->X
    19  	)
    20  
    21  	var t T3
    22  	_ = t.X /* ERROR "ambiguous selector t.X" */
    23  }
    24  
    25  func _() {
    26  	type (
    27  		T1 struct { X int }
    28  		T2 struct { T1 }
    29  		T3 struct { T1 }
    30  		T4 struct { T2; T3 } // X is embedded twice at the same level via T2->T1->X, T3->T1->X
    31  	)
    32  
    33  	var t T4
    34  	_ = t.X /* ERROR "ambiguous selector t.X" */
    35  }
    36  
    37  func issue4355() {
    38  	type (
    39  	    T1 struct {X int}
    40  	    T2 struct {T1}
    41  	    T3 struct {T2}
    42  	    T4 struct {T2}
    43  	    T5 struct {T3; T4} // X is embedded twice at the same level via T3->T2->T1->X, T4->T2->T1->X
    44  	)
    45  
    46  	var t T5
    47  	_ = t.X /* ERROR "ambiguous selector t.X" */
    48  }
    49  
    50  func _() {
    51  	type State int
    52  	type A struct{ State }
    53  	type B struct{ fmt.State }
    54  	type T struct{ A; B }
    55  
    56  	var t T
    57  	_ = t.State /* ERROR "ambiguous selector t.State" */
    58  }
    59  
    60  // Embedded fields can be predeclared types.
    61  
    62  func _() {
    63  	type T0 struct{
    64  		int
    65  		float32
    66  		f int
    67  	}
    68  	var x T0
    69  	_ = x.int
    70  	_ = x.float32
    71  	_ = x.f
    72  
    73  	type T1 struct{
    74  		T0
    75  	}
    76  	var y T1
    77  	_ = y.int
    78  	_ = y.float32
    79  	_ = y.f
    80  }
    81  
    82  // Restrictions on embedded field types.
    83  
    84  func _() {
    85  	type I1 interface{}
    86  	type I2 interface{}
    87  	type P1 *int
    88  	type P2 *int
    89  	type UP unsafe.Pointer
    90  
    91  	type T1 struct {
    92  		I1
    93  		* /* ERROR "cannot be a pointer to an interface" */ I2
    94  		* /* ERROR "cannot be a pointer to an interface" */ error
    95  		P1 /* ERROR "cannot be a pointer" */
    96  		* /* ERROR "cannot be a pointer" */ P2
    97  	}
    98  
    99  	// unsafe.Pointers are treated like regular pointers when embedded
   100  	type T2 struct {
   101  		unsafe /* ERROR "cannot be unsafe.Pointer" */ .Pointer
   102  		*/* ERROR "cannot be unsafe.Pointer" */ unsafe.Pointer /* ERROR "Pointer redeclared" */
   103  		UP /* ERROR "cannot be unsafe.Pointer" */
   104  		* /* ERROR "cannot be unsafe.Pointer" */ UP /* ERROR "UP redeclared" */
   105  	}
   106  }
   107  
   108  // Named types that are pointers.
   109  
   110  type S struct{ x int }
   111  func (*S) m() {}
   112  type P *S
   113  
   114  func _() {
   115  	var s *S
   116  	_ = s.x
   117  	_ = s.m
   118  
   119  	var p P
   120  	_ = p.x
   121  	_ = p.m /* ERROR "no field or method" */
   122  	_ = P.m /* ERROR "no field or method" */
   123  }
   124  
   125  // Borrowed from the FieldByName test cases in reflect/all_test.go.
   126  
   127  type D1 struct {
   128  	d int
   129  }
   130  type D2 struct {
   131  	d int
   132  }
   133  
   134  type S0 struct {
   135  	A, B, C int
   136  	D1
   137  	D2
   138  }
   139  
   140  type S1 struct {
   141  	B int
   142  	S0
   143  }
   144  
   145  type S2 struct {
   146  	A int
   147  	*S1
   148  }
   149  
   150  type S1x struct {
   151  	S1
   152  }
   153  
   154  type S1y struct {
   155  	S1
   156  }
   157  
   158  type S3 struct {
   159  	S1x
   160  	S2
   161  	D, E int
   162  	*S1y
   163  }
   164  
   165  type S4 struct {
   166  	*S4
   167  	A int
   168  }
   169  
   170  // The X in S6 and S7 annihilate, but they also block the X in S8.S9.
   171  type S5 struct {
   172  	S6
   173  	S7
   174  	S8
   175  }
   176  
   177  type S6 struct {
   178  	X int
   179  }
   180  
   181  type S7 S6
   182  
   183  type S8 struct {
   184  	S9
   185  }
   186  
   187  type S9 struct {
   188  	X int
   189  	Y int
   190  }
   191  
   192  // The X in S11.S6 and S12.S6 annihilate, but they also block the X in S13.S8.S9.
   193  type S10 struct {
   194  	S11
   195  	S12
   196  	S13
   197  }
   198  
   199  type S11 struct {
   200  	S6
   201  }
   202  
   203  type S12 struct {
   204  	S6
   205  }
   206  
   207  type S13 struct {
   208  	S8
   209  }
   210  
   211  func _() {
   212  	_ = struct{}{}.Foo /* ERROR "no field or method" */
   213  	_ = S0{}.A
   214  	_ = S0{}.D /* ERROR "no field or method" */
   215  	_ = S1{}.A
   216  	_ = S1{}.B
   217  	_ = S1{}.S0
   218  	_ = S1{}.C
   219  	_ = S2{}.A
   220  	_ = S2{}.S1
   221  	_ = S2{}.B
   222  	_ = S2{}.C
   223  	_ = S2{}.D /* ERROR "no field or method" */
   224  	_ = S3{}.S1 /* ERROR "ambiguous selector S3{}.S1" */
   225  	_ = S3{}.A
   226  	_ = S3{}.B /* ERROR "ambiguous selector S3{}.B" */
   227  	_ = S3{}.D
   228  	_ = S3{}.E
   229  	_ = S4{}.A
   230  	_ = S4{}.B /* ERROR "no field or method" */
   231  	_ = S5{}.X /* ERROR "ambiguous selector S5{}.X" */
   232  	_ = S5{}.Y
   233  	_ = S10{}.X /* ERROR "ambiguous selector S10{}.X" */
   234  	_ = S10{}.Y
   235  }
   236  
   237  // Borrowed from the FieldByName benchmark in reflect/all_test.go.
   238  
   239  type R0 struct {
   240  	*R1
   241  	*R2
   242  	*R3
   243  	*R4
   244  }
   245  
   246  type R1 struct {
   247  	*R5
   248  	*R6
   249  	*R7
   250  	*R8
   251  }
   252  
   253  type R2 R1
   254  type R3 R1
   255  type R4 R1
   256  
   257  type R5 struct {
   258  	*R9
   259  	*R10
   260  	*R11
   261  	*R12
   262  }
   263  
   264  type R6 R5
   265  type R7 R5
   266  type R8 R5
   267  
   268  type R9 struct {
   269  	*R13
   270  	*R14
   271  	*R15
   272  	*R16
   273  }
   274  
   275  type R10 R9
   276  type R11 R9
   277  type R12 R9
   278  
   279  type R13 struct {
   280  	*R17
   281  	*R18
   282  	*R19
   283  	*R20
   284  }
   285  
   286  type R14 R13
   287  type R15 R13
   288  type R16 R13
   289  
   290  type R17 struct {
   291  	*R21
   292  	*R22
   293  	*R23
   294  	*R24
   295  }
   296  
   297  type R18 R17
   298  type R19 R17
   299  type R20 R17
   300  
   301  type R21 struct {
   302  	X int
   303  }
   304  
   305  type R22 R21
   306  type R23 R21
   307  type R24 R21
   308  
   309  var _ = R0{}.X /* ERROR "ambiguous selector R0{}.X" */