|  | // 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") | 
|  | } | 
|  | } |