// CHECK:
//   Mangled name: B
//   Public signature: /B|null[0]
open class B : A<B>, Foo {
  // CHECK:
  //   Mangled name: B#<init>(){}
  //   Public signature: /B.<init>|-5645683436151566731[0]
  //   Public signature debug description: <init>(){}
  constructor() /* primary */

}

// CHECK:
//   Mangled name: C
//   Public signature: /C|null[0]
open class C : A<C>, Foo {
  // CHECK:
  //   Mangled name: C#<init>(){}
  //   Public signature: /C.<init>|-5645683436151566731[0]
  //   Public signature debug description: <init>(){}
  constructor() /* primary */

}

// CHECK:
//   Mangled name: A
//   Public signature: /A|null[0]
interface A<out T : Any?> {

}

// CHECK:
//   Mangled name: Foo
//   Public signature: /Foo|null[0]
interface Foo {

}

// CHECK JVM_IR:
//   Mangled name: #foo(){}kotlin.Any
//   Public signature: /foo|-9059697968601777418[0]
//   Public signature debug description: foo(){}kotlin.Any
// CHECK JS_IR NATIVE:
//   Mangled name: #foo(){}
//   Public signature: /foo|-1041209573719867811[0]
//   Public signature debug description: foo(){}
fun foo(): Any

// CHECK JVM_IR:
//   Mangled name: #run(kotlin.Function0<0:0>){0§<kotlin.Any?>}0:0
//   Public signature: /run|3503148828372491191[0]
//   Public signature debug description: run(kotlin.Function0<0:0>){0§<kotlin.Any?>}0:0
// CHECK JS_IR NATIVE:
//   Mangled name: #run(kotlin.Function0<0:0>){0§<kotlin.Any?>}
//   Public signature: /run|8432521068183421057[0]
//   Public signature debug description: run(kotlin.Function0<0:0>){0§<kotlin.Any?>}
fun <T : Any?> run(fn: Function0<T>): T

