| // 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 |
| |
| // Check that all methods of T are collected before |
| // determining the result type of m (which embeds |
| // all methods of T). |
| |
| type T interface { |
| m() interface {T} |
| E |
| } |
| |
| var _ = T.m(nil).m().e() |
| |
| type E interface { |
| e() int |
| } |
| |
| // Check that unresolved forward chains are followed |
| // (see also comment in resolver.go, checker.typeDecl). |
| |
| var _ = C.m(nil).m().e() |
| |
| type A B |
| |
| type B interface { |
| m() interface{C} |
| E |
| } |
| |
| type C A |
| |
| // Check that interface type comparison for identity |
| // does not recur endlessly. |
| |
| type T1 interface { |
| m() interface{T1} |
| } |
| |
| type T2 interface { |
| m() interface{T2} |
| } |
| |
| func _(x T1, y T2) { |
| // Checking for assignability of interfaces must check |
| // if all methods of x are present in y, and that they |
| // have identical signatures. The signatures recur via |
| // the result type, which is an interface that embeds |
| // a single method m that refers to the very interface |
| // that contains it. This requires cycle detection in |
| // identity checks for interface types. |
| x = y |
| } |
| |
| type T3 interface { |
| m() interface{T4} |
| } |
| |
| type T4 interface { |
| m() interface{T3} |
| } |
| |
| func _(x T1, y T3) { |
| x = y |
| } |
| |
| // Check that interfaces are type-checked in order of |
| // (embedded interface) dependencies (was issue 7158). |
| |
| var x1 T5 = T7(nil) |
| |
| type T5 interface { |
| T6 |
| } |
| |
| type T6 interface { |
| m() T7 |
| } |
| type T7 interface { |
| T5 |
| } |
| |
| // Actual test case from issue 7158. |
| |
| func wrapNode() Node { |
| return wrapElement() |
| } |
| |
| func wrapElement() Element { |
| return nil |
| } |
| |
| type EventTarget interface { |
| AddEventListener(Event) |
| } |
| |
| type Node interface { |
| EventTarget |
| } |
| |
| type Element interface { |
| Node |
| } |
| |
| type Event interface { |
| Target() Element |
| } |