fun test1(x: String?): Int {
  return when {
    EQEQ(arg0 = x, arg1 = null) -> 0
    else -> x.<get-length>()
  }
}

fun <T : CharSequence?> test2(x: T): Int {
  return when {
    EQEQ(arg0 = x, arg1 = null) -> 0
    else -> x.<get-length>()
  }
}

inline fun <reified T : CharSequence?> test3(x: Any): Int {
  return when {
    x !is T -> 0
    else -> x /*as (T & Any) */.<get-length>()
  }
}

inline fun <reified T : CharSequence> test4(x: Any?): Int {
  return when {
    x !is T -> 0
    else -> x /*as T */.<get-length>()
  }
}

fun <T : S?, S : Any?> test5(x: T, fn: Function1<S, Unit>) {
  when {
    EQEQ(arg0 = x, arg1 = null).not() -> fn.invoke(p1 = x)
  }
}
