FILE fqName:<root> fileName:/smartcastToIntersection.kt
  CLASS CLASS name:Bar modality:OPEN visibility:public superTypes:[<root>.IParentImpl; <root>.IChild]
    thisReceiver: VALUE_PARAMETER INSTANCE_RECEIVER kind:DispatchReceiver name:<this> type:<root>.Bar
    CONSTRUCTOR visibility:public returnType:<root>.Bar [primary]
      BLOCK_BODY
        DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () declared in <root>.IParentImpl'
        INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Bar modality:OPEN visibility:public superTypes:[<root>.IParentImpl; <root>.IChild]' type=kotlin.Unit
    FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN returnType:kotlin.Boolean [fake_override,operator]
      VALUE_PARAMETER kind:DispatchReceiver name:<this> index:0 type:kotlin.Any
      VALUE_PARAMETER kind:Regular name:other index:1 type:kotlin.Any?
      overridden:
        public open fun equals (other: kotlin.Any?): kotlin.Boolean declared in <root>.IParentImpl
        public open fun equals (other: kotlin.Any?): kotlin.Boolean declared in <root>.IChild
    FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN returnType:kotlin.Int [fake_override]
      VALUE_PARAMETER kind:DispatchReceiver name:<this> index:0 type:kotlin.Any
      overridden:
        public open fun hashCode (): kotlin.Int declared in <root>.IParentImpl
        public open fun hashCode (): kotlin.Int declared in <root>.IChild
    FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN returnType:kotlin.String [fake_override]
      VALUE_PARAMETER kind:DispatchReceiver name:<this> index:0 type:kotlin.Any
      overridden:
        public open fun toString (): kotlin.String declared in <root>.IParentImpl
        public open fun toString (): kotlin.String declared in <root>.IChild
    FUN name:b visibility:public modality:OPEN returnType:kotlin.String
      VALUE_PARAMETER kind:DispatchReceiver name:<this> index:0 type:<root>.Bar
      VALUE_PARAMETER kind:Regular name:t index:1 type:kotlin.String
      overridden:
        public open fun b (t: kotlin.String): kotlin.String declared in <root>.IParentImpl
        public abstract fun b (t: kotlin.String): kotlin.String declared in <root>.IChild
      BLOCK_BODY
        RETURN type=kotlin.Nothing from='public open fun b (t: kotlin.String): kotlin.String declared in <root>.Bar'
          CONST String type=kotlin.String value="Bar"
  CLASS CLASS name:Foo modality:OPEN visibility:public superTypes:[<root>.IParentImpl; <root>.IChild]
    thisReceiver: VALUE_PARAMETER INSTANCE_RECEIVER kind:DispatchReceiver name:<this> type:<root>.Foo
    CONSTRUCTOR visibility:public returnType:<root>.Foo [primary]
      BLOCK_BODY
        DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () declared in <root>.IParentImpl'
        INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Foo modality:OPEN visibility:public superTypes:[<root>.IParentImpl; <root>.IChild]' type=kotlin.Unit
    FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN returnType:kotlin.Boolean [fake_override,operator]
      VALUE_PARAMETER kind:DispatchReceiver name:<this> index:0 type:kotlin.Any
      VALUE_PARAMETER kind:Regular name:other index:1 type:kotlin.Any?
      overridden:
        public open fun equals (other: kotlin.Any?): kotlin.Boolean declared in <root>.IParentImpl
        public open fun equals (other: kotlin.Any?): kotlin.Boolean declared in <root>.IChild
    FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN returnType:kotlin.Int [fake_override]
      VALUE_PARAMETER kind:DispatchReceiver name:<this> index:0 type:kotlin.Any
      overridden:
        public open fun hashCode (): kotlin.Int declared in <root>.IParentImpl
        public open fun hashCode (): kotlin.Int declared in <root>.IChild
    FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN returnType:kotlin.String [fake_override]
      VALUE_PARAMETER kind:DispatchReceiver name:<this> index:0 type:kotlin.Any
      overridden:
        public open fun toString (): kotlin.String declared in <root>.IParentImpl
        public open fun toString (): kotlin.String declared in <root>.IChild
    FUN name:b visibility:public modality:OPEN returnType:kotlin.String
      VALUE_PARAMETER kind:DispatchReceiver name:<this> index:0 type:<root>.Foo
      VALUE_PARAMETER kind:Regular name:t index:1 type:kotlin.String
      overridden:
        public open fun b (t: kotlin.String): kotlin.String declared in <root>.IParentImpl
        public abstract fun b (t: kotlin.String): kotlin.String declared in <root>.IChild
      BLOCK_BODY
        RETURN type=kotlin.Nothing from='public open fun b (t: kotlin.String): kotlin.String declared in <root>.Foo'
          CONST String type=kotlin.String value="Foo"
  CLASS CLASS name:IParentImpl modality:OPEN visibility:public superTypes:[<root>.IParent<kotlin.String, kotlin.String>]
    thisReceiver: VALUE_PARAMETER INSTANCE_RECEIVER kind:DispatchReceiver name:<this> type:<root>.IParentImpl
    CONSTRUCTOR visibility:public returnType:<root>.IParentImpl [primary]
      BLOCK_BODY
        DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () declared in kotlin.Any'
        INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:IParentImpl modality:OPEN visibility:public superTypes:[<root>.IParent<kotlin.String, kotlin.String>]' type=kotlin.Unit
    FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN returnType:kotlin.Boolean [fake_override,operator]
      VALUE_PARAMETER kind:DispatchReceiver name:<this> index:0 type:kotlin.Any
      VALUE_PARAMETER kind:Regular name:other index:1 type:kotlin.Any?
      overridden:
        public open fun equals (other: kotlin.Any?): kotlin.Boolean declared in <root>.IParent
    FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN returnType:kotlin.Int [fake_override]
      VALUE_PARAMETER kind:DispatchReceiver name:<this> index:0 type:kotlin.Any
      overridden:
        public open fun hashCode (): kotlin.Int declared in <root>.IParent
    FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN returnType:kotlin.String [fake_override]
      VALUE_PARAMETER kind:DispatchReceiver name:<this> index:0 type:kotlin.Any
      overridden:
        public open fun toString (): kotlin.String declared in <root>.IParent
    FUN name:b visibility:public modality:OPEN returnType:kotlin.String
      VALUE_PARAMETER kind:DispatchReceiver name:<this> index:0 type:<root>.IParentImpl
      VALUE_PARAMETER kind:Regular name:t index:1 type:kotlin.String
      overridden:
        public abstract fun b (t: T of <root>.IParent): V of <root>.IParent declared in <root>.IParent
      BLOCK_BODY
        RETURN type=kotlin.Nothing from='public open fun b (t: kotlin.String): kotlin.String declared in <root>.IParentImpl'
          CONST String type=kotlin.String value="ParentIntImpl"
  CLASS INTERFACE name:IChild modality:ABSTRACT visibility:public superTypes:[<root>.IParent<kotlin.String, kotlin.String>]
    thisReceiver: VALUE_PARAMETER INSTANCE_RECEIVER kind:DispatchReceiver name:<this> type:<root>.IChild
    FUN FAKE_OVERRIDE name:b visibility:public modality:ABSTRACT returnType:kotlin.String [fake_override]
      VALUE_PARAMETER kind:DispatchReceiver name:<this> index:0 type:<root>.IParent<kotlin.String, kotlin.String>
      VALUE_PARAMETER kind:Regular name:t index:1 type:kotlin.String
      overridden:
        public abstract fun b (t: T of <root>.IParent): V of <root>.IParent declared in <root>.IParent
    FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN returnType:kotlin.Boolean [fake_override,operator]
      VALUE_PARAMETER kind:DispatchReceiver name:<this> index:0 type:kotlin.Any
      VALUE_PARAMETER kind:Regular name:other index:1 type:kotlin.Any?
      overridden:
        public open fun equals (other: kotlin.Any?): kotlin.Boolean declared in <root>.IParent
    FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN returnType:kotlin.Int [fake_override]
      VALUE_PARAMETER kind:DispatchReceiver name:<this> index:0 type:kotlin.Any
      overridden:
        public open fun hashCode (): kotlin.Int declared in <root>.IParent
    FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN returnType:kotlin.String [fake_override]
      VALUE_PARAMETER kind:DispatchReceiver name:<this> index:0 type:kotlin.Any
      overridden:
        public open fun toString (): kotlin.String declared in <root>.IParent
  CLASS INTERFACE name:IParent modality:ABSTRACT visibility:public superTypes:[kotlin.Any]
    thisReceiver: VALUE_PARAMETER INSTANCE_RECEIVER kind:DispatchReceiver name:<this> type:<root>.IParent<T of <root>.IParent, V of <root>.IParent>
    TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?] reified:false
    TYPE_PARAMETER name:V index:1 variance: superTypes:[kotlin.Any?] reified:false
    FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN returnType:kotlin.Boolean [fake_override,operator]
      VALUE_PARAMETER kind:DispatchReceiver name:<this> index:0 type:kotlin.Any
      VALUE_PARAMETER kind:Regular name:other index:1 type:kotlin.Any?
      overridden:
        public open fun equals (other: kotlin.Any?): kotlin.Boolean declared in kotlin.Any
    FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN returnType:kotlin.Int [fake_override]
      VALUE_PARAMETER kind:DispatchReceiver name:<this> index:0 type:kotlin.Any
      overridden:
        public open fun hashCode (): kotlin.Int declared in kotlin.Any
    FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN returnType:kotlin.String [fake_override]
      VALUE_PARAMETER kind:DispatchReceiver name:<this> index:0 type:kotlin.Any
      overridden:
        public open fun toString (): kotlin.String declared in kotlin.Any
    FUN name:b visibility:public modality:ABSTRACT returnType:V of <root>.IParent
      VALUE_PARAMETER kind:DispatchReceiver name:<this> index:0 type:<root>.IParent<T of <root>.IParent, V of <root>.IParent>
      VALUE_PARAMETER kind:Regular name:t index:1 type:T of <root>.IParent
  FUN name:getChild visibility:public modality:FINAL returnType:<root>.IChild?
    BLOCK_BODY
      VAR name:child type:<root>.IChild? [val]
        CONSTRUCTOR_CALL 'public constructor <init> () declared in <root>.Bar' type=<root>.Bar origin=null
      VAR name:isFooOrBar type:kotlin.Boolean [val]
        WHEN type=kotlin.Boolean origin=OROR
          BRANCH
            if: TYPE_OP type=kotlin.Boolean origin=INSTANCEOF typeOperand=<root>.Foo
              GET_VAR 'val child: <root>.IChild? declared in <root>.getChild' type=<root>.IChild? origin=null
            then: CONST Boolean type=kotlin.Boolean value=true
          BRANCH
            if: CONST Boolean type=kotlin.Boolean value=true
            then: TYPE_OP type=kotlin.Boolean origin=INSTANCEOF typeOperand=<root>.Bar
              GET_VAR 'val child: <root>.IChild? declared in <root>.getChild' type=<root>.IChild? origin=null
      RETURN type=kotlin.Nothing from='public final fun getChild (): <root>.IChild? declared in <root>'
        WHEN type=<root>.IChild? origin=IF
          BRANCH
            if: GET_VAR 'val isFooOrBar: kotlin.Boolean declared in <root>.getChild' type=kotlin.Boolean origin=null
            then: GET_VAR 'val child: <root>.IChild? declared in <root>.getChild' type=<root>.IChild? origin=null
          BRANCH
            if: CONST Boolean type=kotlin.Boolean value=true
            then: CONST Null type=kotlin.Nothing? value=null
  FUN name:test visibility:public modality:FINAL returnType:kotlin.String?
    BLOCK_BODY
      RETURN type=kotlin.Nothing from='public final fun test (): kotlin.String? declared in <root>'
        BLOCK type=kotlin.String? origin=SAFE_CALL
          VAR IR_TEMPORARY_VARIABLE name:tmp_0 type:<root>.IChild? [val]
            CALL 'public final fun getChild (): <root>.IChild? declared in <root>' type=<root>.IChild? origin=null
          WHEN type=kotlin.String? origin=null
            BRANCH
              if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ
                ARG arg0: GET_VAR 'val tmp_0: <root>.IChild? declared in <root>.test' type=<root>.IChild? origin=null
                ARG arg1: CONST Null type=kotlin.Nothing? value=null
              then: CONST Null type=kotlin.Nothing? value=null
            BRANCH
              if: CONST Boolean type=kotlin.Boolean value=true
              then: CALL 'public abstract fun b (t: kotlin.String): kotlin.String declared in <root>.IChild' type=kotlin.String origin=null
                ARG <this>: GET_VAR 'val tmp_0: <root>.IChild? declared in <root>.test' type=<root>.IChild? origin=null
                ARG t: CONST String type=kotlin.String value=""
