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