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