blob: d6f07b30e2ffdb6eee2b83f44b100d3016fe39be [file] [log] [blame]
Keith Randall807c80f2017-01-11 16:40:24 -08001// run
2
3// Copyright 2017 The Go Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7// This test makes sure that itabs are unique.
8// More explicitly, we require that only one itab structure exists for the pair of
9// a given compile-time interface type and underlying concrete type.
10// Ensuring this invariant enables fixes for 18492 (improve type switch code).
11
12package main
13
14type I interface {
15 M()
16}
17type J interface {
18 M()
19}
20
21type T struct{}
22
23func (*T) M() {}
24
25func main() {
26 test1()
27 test2()
28}
29
30func test1() {
31 t := new(T)
32 var i1, i2 I
33 var j interface {
34 M()
35 }
36 i1 = t
37 j = t
38 i2 = j
39 if i1 != i2 {
40 panic("interfaces not equal")
41 }
42}
43
44func test2() {
45 t := new(T)
46 i1 := (I)(t)
47 i2 := (I)((interface {
48 M()
49 })((J)(t)))
50 if i1 != i2 {
51 panic("interfaces not equal")
52 }
53}