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