fun use(fn: Function1<Int, String>): String {
  return fn.invoke(p1 = 1)
}

fun use0(fn: Function0<String>): String {
  return fn.invoke()
}

fun coerceToUnit(fn: Function1<Int, Unit>) {
}

fun fnWithDefault(a: Int, b: Int = 42): String {
  return "abc"
}

fun fnWithDefaults(a: Int = 1, b: Int = 2): String {
  return ""
}

fun fnWithVarargs(vararg xs: Int): String {
  return "abc"
}

object Host {
  private constructor() /* primary */ {
    super/*Any*/()
    /* <init>() */

  }

  fun importedObjectMemberWithVarargs(vararg xs: Int): String {
    return "abc"
  }

}

fun testDefault(): String {
  return use(fn = { // BLOCK
    local fun fnWithDefault(p0: Int): String {
      return fnWithDefault(a = p0)
    }

    ::fnWithDefault
  })
}

fun testVararg(): String {
  return use(fn = { // BLOCK
    local fun fnWithVarargs(p0: Int): String {
      return fnWithVarargs(xs = [p0])
    }

    ::fnWithVarargs
  })
}

fun testCoercionToUnit() {
  return coerceToUnit(fn = { // BLOCK
    local fun fnWithDefault(p0: Int) {
      fnWithDefault(a = p0) /*~> Unit */
    }

    ::fnWithDefault
  })
}

fun testImportedObjectMember(): String {
  return use(fn = { // BLOCK
    local fun Host.importedObjectMemberWithVarargs(p0: Int): String {
      return receiver.importedObjectMemberWithVarargs(xs = [p0])
    }

    Host::importedObjectMemberWithVarargs
  })
}

fun testDefault0(): String {
  return use0(fn = { // BLOCK
    local fun fnWithDefaults(): String {
      return fnWithDefaults()
    }

    ::fnWithDefaults
  })
}

fun testVararg0(): String {
  return use0(fn = { // BLOCK
    local fun fnWithVarargs(): String {
      return fnWithVarargs()
    }

    ::fnWithVarargs
  })
}
