abstract class Bar<T : Any> {
  constructor() /* primary */ {
    super/*Any*/()
    /* <init>() */

  }

  abstract fun bar()

}

interface Foo<out T : Any?> {
  abstract fun foo()

}

fun <T : Any> Bar<T>.extBar() {
}

fun <T : Any?> Foo<T>.extFoo() {
}

fun <K : Any?> materialize(): K {
  return CHECK_NOT_NULL<Nothing>(arg0 = null)
}

fun test_1(x: Any) {
  x as Bar<Any> /*~> Unit */
  x /*as Bar<Any> */ as Foo<Any> /*~> Unit */
  x /*as Foo<Any> */.foo()
  x /*as Bar<Any> */.bar()
  x /*as Foo<Any> */.extFoo<Any>()
  x /*as Bar<Any> */.extBar<Any>()
}

fun test_2(x: Any) {
  x as Bar<Any>? /*~> Unit */
  x /*as Bar<Any> */ as Foo<Any>? /*~> Unit */
  CHECK_NOT_NULL<Any>(arg0 = x) /*as Foo<Any> */.foo()
  CHECK_NOT_NULL<Any>(arg0 = x) /*as Bar<Any> */.bar()
  CHECK_NOT_NULL<Any>(arg0 = x) /*as Foo<Any> */.extFoo<Any>()
  CHECK_NOT_NULL<Any>(arg0 = x) /*as Bar<Any> */.extBar<Any>()
}

fun test_3(x: Any) {
  x as Bar<Any>? /*~> Unit */
  x /*as Bar<Any> */ as Foo<Any>? /*~> Unit */
  { // BLOCK
    val tmp_0: Any = x
    when {
      EQEQ(arg0 = tmp_0, arg1 = null) -> materialize<Any>()
      else -> tmp_0
    }
  } /*as Foo<Any> */.foo()
  { // BLOCK
    val tmp_1: Any = x
    when {
      EQEQ(arg0 = tmp_1, arg1 = null) -> materialize<Any>()
      else -> tmp_1
    }
  } /*as Bar<Any> */.bar()
  { // BLOCK
    val tmp_2: Any = x
    when {
      EQEQ(arg0 = tmp_2, arg1 = null) -> materialize<Any>()
      else -> tmp_2
    }
  } /*as Foo<Any> */.extFoo<Any>()
  { // BLOCK
    val tmp_3: Any = x
    when {
      EQEQ(arg0 = tmp_3, arg1 = null) -> materialize<Any>()
      else -> tmp_3
    }
  } /*as Bar<Any> */.extBar<Any>()
}

