| // 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 "./p1/ssa" |
| ssa2 "./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)) |
| } |
| } |