FILE: smartcast_ok.kt
    public final class Regular : R|kotlin/Any| {
        public constructor(): R|Regular| {
            super<R|kotlin/Any|>()
        }

        public final fun useSite_1(): R|kotlin/Unit| {
            lval x: R|kotlin/Any?| = R|/Regular.Regular|()
            when () {
                !=(this@R|/Regular|, R|<local>/x|) ->  {
                    Null(null)!!
                }
            }

            R|<local>/x|.R|/Regular.p1|
        }

        public final val p1: R|kotlin/String|
            public get(): R|kotlin/String| {
                ^ String(!)
            }

        public open override operator fun equals([EqualityBoundType=Regular] @R|kotlin/EqualityBound|(bound = <getClass>(Q|Regular|) [evaluated = <getClass>(Q|Regular|)]) other: R|kotlin/Any?|): R|kotlin/Boolean| {
            ^equals Boolean(true)
        }

    }
    public final fun useSite_2(x: R|kotlin/Any?|): R|kotlin/Int?| {
        when () {
            ==(R|/Regular.Regular|(), R|<local>/x|) ->  {
                ^useSite_2 R|<local>/x|.R|/Regular.p1|.R|kotlin/String.length|
            }
        }

        ^useSite_2 Null(null)
    }
    public open class Super : R|kotlin/Any| {
        public constructor(p2: R|kotlin/String|): R|Super| {
            super<R|kotlin/Any|>()
        }

        public final var p2: R|kotlin/String| = R|<local>/p2|
            public get(): R|kotlin/String|
            public set(value: R|kotlin/String|): R|kotlin/Unit|

    }
    public final class Child : R|Super| {
        public constructor(): R|Child| {
            super<R|Super|>(String(!))
        }

        public open override operator fun equals([EqualityBoundType=Super] @R|kotlin/EqualityBound|(bound = <getClass>(Q|Super|) [evaluated = <getClass>(Q|Super|)]) other: R|kotlin/Any?|): R|kotlin/Boolean| {
            ^equals Boolean(true)
        }

    }
    public final val R|Child|.useSite_3: R|Super?|
        public get(): R|Super?| {
            ^ this@R|/useSite_3|.R|kotlin/run|<R|Child|, R|Super?|>(<L> = run@fun R|Child|.<anonymous>(): R|Super?| <inline=Inline, kind=EXACTLY_ONCE>  {
                lvar x: R|kotlin/Any?| = R|/Super.Super|(String(!))
                when () {
                    !=(this@R|special/anonymous|, R|<local>/x|) || ==(R|<local>/x|.R|/Super.p2|.R|kotlin/String.length|, Int(0)) ->  {
                        ^@run Null(null)
                    }
                }

                ^ R|<local>/x|
            }
            )
        }
    public abstract class Inheritable : R|kotlin/Any| {
        public constructor(): R|Inheritable| {
            super<R|kotlin/Any|>()
        }

        public open override operator fun equals([EqualityBoundType=Inheritable] @R|kotlin/EqualityBound|(bound = <getClass>(Q|Inheritable|) [evaluated = <getClass>(Q|Inheritable|)]) other: R|kotlin/Any?|): R|kotlin/Boolean| {
            ^equals Boolean(true)
        }

    }
    public final class Inherited : R|Inheritable| {
        public constructor(): R|Inherited| {
            super<R|Inheritable|>()
        }

    }
    public final fun useSite_4(x: R|kotlin/Any?|, y: R|kotlin/Any?|): R|Inheritable?| {
        when () {
            (R|<local>/x| !is R|Inherited|) ->  {
                ^useSite_4 Null(null)
            }
        }

        when () {
            !=(R|<local>/x|, R|<local>/y|) ->  {
                ^useSite_4 Null(null)
            }
        }

        ^useSite_4 R|<local>/y|
    }
    public final class Generic<T : R|kotlin/CharSequence|> : R|kotlin/Any| {
        public constructor<T : R|kotlin/CharSequence|>(p3: R|T|): R|Generic<T>| {
            super<R|kotlin/Any|>()
        }

        public final val p3: R|T| = R|<local>/p3|
            public get(): R|T|

        public open override operator fun equals([EqualityBoundType=Generic<*>] @R|kotlin/EqualityBound|(bound = <getClass>(Q|Generic|) [evaluated = <getClass>(Q|Generic|)]) other: R|kotlin/Any?|): R|kotlin/Boolean| {
            ^equals Boolean(true)
        }

        public final fun useSite_5(other: R|kotlin/Any|): R|kotlin/Boolean| {
            ^useSite_5 ==(this@R|/Generic|, R|<local>/other|) && ==(R|<local>/other|.R|SubstitutionOverride</Generic.p3: R|CapturedType(*)|>|.R|kotlin/CharSequence.length|, Int(42))
        }

        public final inner class Inner<Outer(T) : R|kotlin/CharSequence|> : R|kotlin/Any| {
            public Generic<T>.constructor(p4: R|T|): R|Generic.Inner<T>| {
                super<R|kotlin/Any|>()
            }

            public final val p4: R|T| = R|<local>/p4|
                public get(): R|T|

            public open override operator fun equals([EqualityBoundType=Generic.Inner<*>] @R|kotlin/EqualityBound|(bound = <getClass>(Q|Generic.Inner|) [evaluated = <getClass>(Q|Generic.Inner|)]) other: R|kotlin/Any?|): R|kotlin/Boolean| {
                ^equals Boolean(true)
            }

            public final fun useSite_6(other: R|kotlin/Any|): R|kotlin/Boolean| {
                ^useSite_6 ==(this@R|/Generic.Inner|, R|<local>/other|) && ==(R|<local>/other|.R|SubstitutionOverride</Generic.Inner.p4: R|CapturedType(*)|>|.R|kotlin/CharSequence.length|, Int(42))
            }

        }

    }
