| // run | |
| // Copyright 2019 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. | |
| // Do not panic on conversion to anonymous interface, which | |
| // is similar-looking interface types in different packages. | |
| package main | |
| import ( | |
| "fmt" | |
| ssa1 "issue29612.dir/p1/ssa" | |
| ssa2 "issue29612.dir/p2/ssa" | |
| ) | |
| func main() { | |
| v1 := &ssa1.T{} | |
| _ = v1 | |
| v2 := &ssa2.T{} | |
| ssa2.Works(v2) | |
| ssa2.Panics(v2) // This call must not panic | |
| swt(v1, 1) | |
| swt(v2, 2) | |
| } | |
| //go:noinline | |
| func swt(i interface{}, want int) { | |
| var got int | |
| switch i.(type) { | |
| case *ssa1.T: | |
| got = 1 | |
| case *ssa2.T: | |
| got = 2 | |
| case int8, int16, int32, int64: | |
| got = 3 | |
| case uint8, uint16, uint32, uint64: | |
| got = 4 | |
| } | |
| if got != want { | |
| panic(fmt.Sprintf("switch %v: got %d, want %d", i, got, want)) | |
| } | |
| } |