| // Copyright 2013 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 for issue 5090 |
| |
| type t interface { |
| f(u) |
| } |
| |
| type u interface { |
| t |
| } |
| |
| func _() { |
| var t t |
| var u u |
| |
| t.f(t) |
| t.f(u) |
| |
| u.f(t) |
| u.f(u) |
| } |
| |
| |
| // Test case for issue 6589. |
| |
| type A interface { |
| a() interface { |
| AB |
| } |
| } |
| |
| type B interface { |
| a() interface { |
| AB |
| } |
| } |
| |
| type AB interface { |
| a() interface { |
| A |
| B /* ERROR a redeclared */ |
| } |
| b() interface { |
| A |
| B /* ERROR a redeclared */ |
| } |
| } |
| |
| var x AB |
| var y interface { |
| A |
| B /* ERROR a redeclared */ |
| } |
| var _ = x /* ERROR cannot compare */ == y |
| |
| |
| // Test case for issue 6638. |
| |
| type T interface { |
| m() [T /* ERROR no value */ (nil).m()[0]]int |
| } |
| |
| // Variations of this test case. |
| |
| type T1 interface { |
| m() [x1 /* ERROR no value */ .m()[0]]int |
| } |
| |
| var x1 T1 |
| |
| type T2 interface { |
| m() [len(x2 /* ERROR no value */ .m())]int |
| } |
| |
| var x2 T2 |
| |
| type T3 interface { |
| m() [unsafe.Sizeof(x3.m)]int |
| } |
| |
| var x3 T3 |
| |
| // The test case below should also report an error for |
| // the cast inside the T4 interface (like it does for the |
| // variable initialization). The reason why it does not is |
| // that inside T4, the method x4.m depends on T4 which is not |
| // fully set up yet. The x4.m method happens to have an empty |
| // signature which is why the cast is permitted. |
| // TODO(gri) Consider marking methods as incomplete and provide |
| // a better error message in that case. |
| |
| type T4 interface { |
| m() [unsafe.Sizeof(cast4(x4.m))]int |
| } |
| |
| var x4 T4 |
| var _ = cast4(x4 /* ERROR cannot convert */.m) |
| |
| type cast4 func() |
| |
| // This test is symmetric to the T4 case: Here the cast is |
| // "correct", but it doesn't work inside the T5 interface. |
| |
| type T5 interface { |
| m() [unsafe.Sizeof(cast5(x5 /* ERROR cannot convert */ .m))]int |
| } |
| |
| var x5 T5 |
| var _ = cast5(x5.m) |
| |
| type cast5 func() [0]int |