case types.IsExported(f.Sym.Name):
buf = append(buf, sconv(f.Sym, FmtShort, mode)...)
default:
- buf = append(buf, sconv(f.Sym, FmtUnsigned, mode)...)
+ flag1 := FmtLeft
+ if flag&FmtUnsigned != 0 {
+ flag1 = FmtUnsigned
+ }
+ buf = append(buf, sconv(f.Sym, flag1, mode)...)
}
buf = append(buf, tconv(f.Type, FmtShort, mode, depth)...)
}
--- /dev/null
+// 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 (
+ 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
+}
--- /dev/null
+// 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.
+
+package ssa
+
+type T struct{}
+
+func (T) foo() {}
+
+type fooer interface {
+ foo()
+}
+
+func Unused(v interface{}) {
+ v.(fooer).foo()
+ v.(interface{ foo() }).foo()
+}
--- /dev/null
+// 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.
+
+package ssa
+
+type T struct{}
+
+func (T) foo() {}
+
+type fooer interface {
+ foo()
+}
+
+func Works(v interface{}) {
+ switch v.(type) {
+ case interface{}:
+ v.(fooer).foo()
+ }
+}
+
+func Panics(v interface{}) {
+ switch v.(type) {
+ case interface{}:
+ v.(fooer).foo()
+ v.(interface{ foo() }).foo()
+ }
+}