| // Copyright 2017 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package p |
| |
| import "unsafe" |
| |
| // test case from issue #18395 |
| |
| type ( |
| A interface { B } |
| B interface { C } |
| C interface { D; F() A } |
| D interface { G() B } |
| ) |
| |
| var _ = A(nil).G // G must be found |
| |
| |
| // test case from issue #21804 |
| |
| type sourceBridge interface { |
| listVersions() ([]Version, error) |
| } |
| |
| type Constraint interface { |
| copyTo(*ConstraintMsg) |
| } |
| |
| type ConstraintMsg struct{} |
| |
| func (m *ConstraintMsg) asUnpairedVersion() UnpairedVersion { |
| return nil |
| } |
| |
| type Version interface { |
| Constraint |
| } |
| |
| type UnpairedVersion interface { |
| Version |
| } |
| |
| var _ Constraint = UnpairedVersion(nil) |
| |
| |
| // derived test case from issue #21804 |
| |
| type ( |
| _ interface{ m(B1) } |
| A1 interface{ a(D1) } |
| B1 interface{ A1 } |
| C1 interface{ B1 } |
| D1 interface{ C1 } |
| ) |
| |
| var _ A1 = C1(nil) |
| |
| |
| // derived test case from issue #22701 |
| |
| func F(x I4) interface{} { |
| return x.Method() |
| } |
| |
| type Unused interface { |
| RefersToI1(a I1) |
| } |
| |
| type I1 interface { |
| I2 |
| I3 |
| } |
| |
| type I2 interface { |
| RefersToI4() I4 |
| } |
| |
| type I3 interface { |
| Method() interface{} |
| } |
| |
| type I4 interface { |
| I1 |
| } |
| |
| |
| // check embedding of error interface |
| |
| type Error interface{ error } |
| |
| var err Error |
| var _ = err.Error() |
| |
| |
| // more esoteric cases |
| |
| type ( |
| T1 interface { T2 } |
| T2 /* ERROR cycle */ T2 |
| ) |
| |
| type ( |
| T3 interface { T4 } |
| T4 /* ERROR cycle */ T5 |
| T5 = T6 |
| T6 = T7 |
| T7 = T4 |
| ) |
| |
| |
| // arbitrary code may appear inside an interface |
| |
| const n = unsafe.Sizeof(func(){}) |
| |
| type I interface { |
| m([unsafe.Sizeof(func() { I.m(nil, [n]byte{}) })]byte) |
| } |
| |
| |
| // test cases for varias alias cycles |
| |
| type T10 /* ERROR cycle */ = *T10 // issue #25141 |
| type T11 /* ERROR cycle */ = interface{ f(T11) } // issue #23139 |
| |
| // issue #18640 |
| type ( |
| aa = bb |
| bb struct { |
| *aa |
| } |
| ) |
| |
| type ( |
| a struct{ *b } |
| b = c |
| c struct{ *b } |
| ) |
| |
| // issue #24939 |
| type ( |
| _ interface { |
| M(P) |
| } |
| |
| M interface { |
| F() P |
| } |
| |
| P = interface { |
| I() M |
| } |
| ) |
| |
| // issue #8699 |
| type T12 /* ERROR cycle */ [len(a12)]int |
| var a12 = makeArray() |
| func makeArray() (res T12) { return } |
| |
| // issue #20770 |
| var r /* ERROR cycle */ = newReader() |
| func newReader() r |
| |
| // variations of the theme of #8699 amd #20770 |
| var arr /* ERROR cycle */ = f() |
| func f() [len(arr)]int |
| |
| // TODO(gri) here we should only get one error |
| func ff /* ERROR cycle */ (ff /* ERROR not a type */ ) |
| |
| type T13 /* ERROR cycle */ [len(b13)]int |
| var b13 T13 |
| |
| func g /* ERROR cycle */ () [unsafe.Sizeof(x)]int |
| var x = g |
| |
| func h /* ERROR cycle */ () [h /* ERROR no value */ ()[0]]int { panic(0) } |
| |
| var c14 /* ERROR cycle */ T14 |
| type T14 [uintptr(unsafe.Sizeof(&c14))]byte |