| // Copyright 2019 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 "io" |
| |
| // Alan's initial report. |
| |
| type I interface { f(); String() string } |
| type J interface { g(); String() string } |
| |
| type IJ1 = interface { I; J } |
| type IJ2 = interface { f(); g(); String() string } |
| |
| var _ = (*IJ1)(nil) == (*IJ2)(nil) // static assert that IJ1 and IJ2 are identical types |
| |
| // The canonical example. |
| |
| type ReadWriteCloser interface { io.ReadCloser; io.WriteCloser } |
| |
| // Some more cases. |
| |
| type M interface { m() } |
| type M32 interface { m() int32 } |
| type M64 interface { m() int64 } |
| |
| type U1 interface { m() } |
| type U2 interface { m(); M } |
| type U3 interface { M; m() } |
| type U4 interface { M; M; M } |
| type U5 interface { U1; U2; U3; U4 } |
| |
| type U6 interface { m(); m /* ERROR duplicate method */ () } |
| type U7 interface { M32 /* ERROR duplicate method */ ; m() } |
| type U8 interface { m(); M32 /* ERROR duplicate method */ } |
| type U9 interface { M32; M64 /* ERROR duplicate method */ } |
| |
| // Verify that repeated embedding of the same interface(s) |
| // eliminates duplicate methods early (rather than at the |
| // end) to prevent exponential memory and time use. |
| // Without early elimination, computing T29 may take dozens |
| // of minutes. |
| type ( |
| T0 interface { m() } |
| T1 interface { T0; T0 } |
| T2 interface { T1; T1 } |
| T3 interface { T2; T2 } |
| T4 interface { T3; T3 } |
| T5 interface { T4; T4 } |
| T6 interface { T5; T5 } |
| T7 interface { T6; T6 } |
| T8 interface { T7; T7 } |
| T9 interface { T8; T8 } |
| |
| T10 interface { T9; T9 } |
| T11 interface { T10; T10 } |
| T12 interface { T11; T11 } |
| T13 interface { T12; T12 } |
| T14 interface { T13; T13 } |
| T15 interface { T14; T14 } |
| T16 interface { T15; T15 } |
| T17 interface { T16; T16 } |
| T18 interface { T17; T17 } |
| T19 interface { T18; T18 } |
| |
| T20 interface { T19; T19 } |
| T21 interface { T20; T20 } |
| T22 interface { T21; T21 } |
| T23 interface { T22; T22 } |
| T24 interface { T23; T23 } |
| T25 interface { T24; T24 } |
| T26 interface { T25; T25 } |
| T27 interface { T26; T26 } |
| T28 interface { T27; T27 } |
| T29 interface { T28; T28 } |
| ) |
| |
| // Verify that m is present. |
| var x T29 |
| var _ = x.m |