| // run |
| |
| // 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. |
| |
| // This test makes sure that itabs are unique. |
| // More explicitly, we require that only one itab structure exists for the pair of |
| // a given compile-time interface type and underlying concrete type. |
| // Ensuring this invariant enables fixes for 18492 (improve type switch code). |
| |
| package main |
| |
| type I interface { |
| M() |
| } |
| type J interface { |
| M() |
| } |
| |
| type T struct{} |
| |
| func (*T) M() {} |
| |
| func main() { |
| test1() |
| test2() |
| } |
| |
| func test1() { |
| t := new(T) |
| var i1, i2 I |
| var j interface { |
| M() |
| } |
| i1 = t |
| j = t |
| i2 = j |
| if i1 != i2 { |
| panic("interfaces not equal") |
| } |
| } |
| |
| func test2() { |
| t := new(T) |
| i1 := (I)(t) |
| i2 := (I)((interface { |
| M() |
| })((J)(t))) |
| if i1 != i2 { |
| panic("interfaces not equal") |
| } |
| } |