| // Copyright 2016 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 a | |
| // F is an exported function, small enough to be inlined. | |
| // It defines a local interface with an unexported method | |
| // f, which will appear with a package-qualified method | |
| // name in the export data. | |
| func F(x interface{}) bool { | |
| _, ok := x.(interface { | |
| f() | |
| }) | |
| return ok | |
| } | |
| // Like F but with the unexported interface method f | |
| // defined via an embedded interface t. The compiler | |
| // always flattens embedded interfaces so there should | |
| // be no difference between F and G. Alas, currently | |
| // G is not inlineable (at least via export data), so | |
| // the issue is moot, here. | |
| func G(x interface{}) bool { | |
| type t0 interface { | |
| f() | |
| } | |
| _, ok := x.(interface { | |
| t0 | |
| }) | |
| return ok | |
| } | |
| // Like G but now the embedded interface is declared | |
| // at package level. This function is inlineable via | |
| // export data. The export data representation is like | |
| // for F. | |
| func H(x interface{}) bool { | |
| _, ok := x.(interface { | |
| t1 | |
| }) | |
| return ok | |
| } | |
| type t1 interface { | |
| f() | |
| } |