github.com/JimmyHuang454/JLS-go@v0.0.0-20230831150107-90d536585ba0/internal/types/testdata/check/cycles5.go (about)

     1  // Copyright 2017 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  // test case from issue #18395
    10  
    11  type (
    12  	A interface { B }
    13  	B interface { C }
    14  	C interface { D; F() A }
    15  	D interface { G() B }
    16  )
    17  
    18  var _ = A(nil).G // G must be found
    19  
    20  
    21  // test case from issue #21804
    22  
    23  type sourceBridge interface {
    24  	listVersions() ([]Version, error)
    25  }
    26  
    27  type Constraint interface {
    28  	copyTo(*ConstraintMsg)
    29  }
    30  
    31  type ConstraintMsg struct{}
    32  
    33  func (m *ConstraintMsg) asUnpairedVersion() UnpairedVersion {
    34  	return nil
    35  }
    36  
    37  type Version interface {
    38  	Constraint
    39  }
    40  
    41  type UnpairedVersion interface {
    42  	Version
    43  }
    44  
    45  var _ Constraint = UnpairedVersion(nil)
    46  
    47  
    48  // derived test case from issue #21804
    49  
    50  type (
    51  	_ interface{ m(B1) }
    52  	A1 interface{ a(D1) }
    53  	B1 interface{ A1 }
    54  	C1 interface{ B1 }
    55  	D1 interface{ C1 }
    56  )
    57  
    58  var _ A1 = C1(nil)
    59  
    60  
    61  // derived test case from issue #22701
    62  
    63  func F(x I4) interface{} {
    64  	return x.Method()
    65  }
    66  
    67  type Unused interface {
    68  	RefersToI1(a I1)
    69  }
    70  
    71  type I1 interface {
    72  	I2
    73  	I3
    74  }
    75  
    76  type I2 interface {
    77  	RefersToI4() I4
    78  }
    79  
    80  type I3 interface {
    81  	Method() interface{}
    82  }
    83  
    84  type I4 interface {
    85  	I1
    86  }
    87  
    88  
    89  // check embedding of error interface
    90  
    91  type Error interface{ error }
    92  
    93  var err Error
    94  var _ = err.Error()
    95  
    96  
    97  // more esoteric cases
    98  
    99  type (
   100  	T1 interface { T2 }
   101  	T2 /* ERROR invalid recursive type */ T2
   102  )
   103  
   104  type (
   105  	T3 interface { T4 }
   106  	T4 /* ERROR invalid recursive type */ T5
   107  	T5 = T6
   108  	T6 = T7
   109  	T7 = T4
   110  )
   111  
   112  
   113  // arbitrary code may appear inside an interface
   114  
   115  const n = unsafe.Sizeof(func(){})
   116  
   117  type I interface {
   118  	m([unsafe.Sizeof(func() { I.m(nil, [n]byte{}) })]byte)
   119  }
   120  
   121  
   122  // test cases for varias alias cycles
   123  
   124  type T10 /* ERROR invalid recursive type */ = *T10                 // issue #25141
   125  type T11 /* ERROR invalid recursive type */ = interface{ f(T11) }  // issue #23139
   126  
   127  // issue #18640
   128  type (
   129  	aa = bb
   130  	bb struct {
   131  		*aa
   132  	}
   133  )
   134  
   135  type (
   136  	a struct{ *b }
   137  	b = c
   138  	c struct{ *b /* ERROR invalid use of type alias */ }
   139  )
   140  
   141  // issue #24939
   142  type (
   143  	_ interface {
   144  		M(P)
   145  	}
   146  
   147  	M interface {
   148  		F() P // ERROR invalid use of type alias
   149  	}
   150  
   151  	P = interface {
   152  		I() M
   153  	}
   154  )
   155  
   156  // issue #8699
   157  type T12 /* ERROR invalid recursive type */ [len(a12)]int
   158  var a12 = makeArray()
   159  func makeArray() (res T12) { return }
   160  
   161  // issue #20770
   162  var r /* ERROR invalid cycle in declaration of r */ = newReader()
   163  func newReader() r
   164  
   165  // variations of the theme of #8699 and #20770
   166  var arr /* ERROR cycle */ = f()
   167  func f() [len(arr)]int
   168  
   169  // issue #25790
   170  func ff(ff /* ERROR not a type */ )
   171  func gg((gg /* ERROR not a type */ ))
   172  
   173  type T13 /* ERROR invalid recursive type T13 */ [len(b13)]int
   174  var b13 T13
   175  
   176  func g1() [unsafe.Sizeof(g1)]int
   177  func g2() [unsafe.Sizeof(x2)]int
   178  var x2 = g2
   179  
   180  // verify that we get the correct sizes for the functions above
   181  // (note: assert is statically evaluated in go/types test mode)
   182  func init() {
   183  	assert(unsafe.Sizeof(g1) == 8)
   184  	assert(unsafe.Sizeof(x2) == 8)
   185  }
   186  
   187  func h() [h /* ERROR no value */ ()[0]]int { panic(0) }
   188  
   189  var c14 /* ERROR cycle */ T14
   190  type T14 [uintptr(unsafe.Sizeof(&c14))]byte
   191  
   192  // issue #34333
   193  type T15 /* ERROR invalid recursive type T15 */ struct {
   194  	f func() T16
   195  	b T16
   196  }
   197  
   198  type T16 struct {
   199  	T15
   200  }