// RUN_PIPELINE_TILL: FRONTEND
// DIAGNOSTICS: -DEBUG_INFO_LEAKING_THIS










//////////////////////////////////////////////////////////////////////////////////////////////////
/// READ THIS TEST AS A TABLE IN IDE (It may be not correctly displayed in Space or GitHub)!!! ///
//////////////////////////////////////////////////////////////////////////////////////////////////











// a = final + not initialized in place + deferred init
// e = final + not initialized in place
// c = final + initialized in place

// b = open + not initialized in place + deferred init
// f = open + not initialized in place
// d = open + initialized in place
class Foo : I {
    //                                             no setter;                                                                 setter with field;                                                                       setter with empty body;                                                        setter no field;
    // no getter
                                                   var a00: Int;                                <!MUST_BE_INITIALIZED!>var a01: Int<!>; set(v) { field = v };                                                               var a02: Int; set;                              <!MUST_BE_INITIALIZED!>var a03: Int<!>; set(v) {};
             <!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var e00: Int<!>;                             <!MUST_BE_INITIALIZED!>var e01: Int<!>; set(v) { field = v };                         <!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var e02: Int<!>; set;                           <!MUST_BE_INITIALIZED!>var e03: Int<!>; set(v) {};
                                                   var c00: Int = 1;                                                   var c01: Int = 1; set(v) { field = v };                                                              var c02: Int = 1; set;                                                 var c03: Int = 1; set(v) {};
                                          override var b00: Int;                       override <!MUST_BE_INITIALIZED!>var b01: Int<!>; set(v) { field = v };                                                      override var b02: Int; set;                     override <!MUST_BE_INITIALIZED!>var b03: Int<!>; set(v) {};
    override <!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var f00: Int<!>;                    override <!MUST_BE_INITIALIZED!>var f01: Int<!>; set(v) { field = v };                override <!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var f02: Int<!>; set;                  override <!MUST_BE_INITIALIZED!>var f03: Int<!>; set(v) {};
                                          override var d00: Int = 1;                                          override var d01: Int = 1; set(v) { field = v };                                                     override var d02: Int = 1; set;                                        override var d03: Int = 1; set(v) {};
    // getter with field
                                                   var a10: Int; get() = field;                 <!MUST_BE_INITIALIZED!>var a11: Int<!>; set(v) { field = v } get() = field;                                                 var a12: Int; set get() = field;                <!MUST_BE_INITIALIZED!>var a13: Int<!>; set(v) {} get() = field;
                            <!MUST_BE_INITIALIZED!>var e10: Int<!>; get() = field;              <!MUST_BE_INITIALIZED!>var e11: Int<!>; set(v) { field = v } get() = field;                          <!MUST_BE_INITIALIZED!>var e12: Int<!>; set get() = field;             <!MUST_BE_INITIALIZED!>var e13: Int<!>; set(v) {} get() = field;
                                                   var c10: Int = 1; get() = field;                                    var c11: Int = 1; set(v) { field = v } get() = field;                                                var c12: Int = 1; set get() = field;                                   var c13: Int = 1; set(v) {} get() = field;
                                          override var b10: Int; get() = field;        override <!MUST_BE_INITIALIZED!>var b11: Int<!>; set(v) { field = v } get() = field;                                        override var b12: Int; set get() = field;       override <!MUST_BE_INITIALIZED!>var b13: Int<!>; set(v) {} get() = field;
                   override <!MUST_BE_INITIALIZED!>var f10: Int<!>; get() = field;     override <!MUST_BE_INITIALIZED!>var f11: Int<!>; set(v) { field = v } get() = field;                 override <!MUST_BE_INITIALIZED!>var f12: Int<!>; set get() = field;    override <!MUST_BE_INITIALIZED!>var f13: Int<!>; set(v) {} get() = field;
                                          override var d10: Int = 1; get() = field;                           override var d11: Int = 1; set(v) { field = v } get() = field;                                       override var d12: Int = 1; set get() = field;                          override var d13: Int = 1; set(v) {} get() = field;
    // getter with empty body
                                                   var a20: Int; get;                           <!MUST_BE_INITIALIZED!>var a21: Int<!>; set(v) { field = v } get;                                                           var a22: Int; set get;                          <!MUST_BE_INITIALIZED!>var a23: Int<!>; set(v) {} get;
             <!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var e20: Int<!>; get;                        <!MUST_BE_INITIALIZED!>var e21: Int<!>; set(v) { field = v } get;                     <!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var e22: Int<!>; set get;                       <!MUST_BE_INITIALIZED!>var e23: Int<!>; set(v) {} get;
                                                   var c20: Int = 1; get;                                              var c21: Int = 1; set(v) { field = v } get;                                                          var c22: Int = 1; set get;                                             var c23: Int = 1; set(v) {} get;
                                          override var b20: Int; get;                  override <!MUST_BE_INITIALIZED!>var b21: Int<!>; set(v) { field = v } get;                                                  override var b22: Int; set get;                 override <!MUST_BE_INITIALIZED!>var b23: Int<!>; set(v) {} get;
    override <!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var f20: Int<!>; get;               override <!MUST_BE_INITIALIZED!>var f21: Int<!>; set(v) { field = v } get;            override <!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>var f22: Int<!>; set get;              override <!MUST_BE_INITIALIZED!>var f23: Int<!>; set(v) {} get;
                                          override var d20: Int = 1; get;                                     override var d21: Int = 1; set(v) { field = v } get;                                                 override var d22: Int = 1; set get;                                    override var d23: Int = 1; set(v) {} get;
    // getter no field
                                                   var a30: Int; get() = 1;                     <!MUST_BE_INITIALIZED!>var a31: Int<!>; set(v) { field = v } get() = 1;                                                     var a32: Int; set get() = 1;                                           var a33: Int; set(v) {} get() = 1;
                            <!MUST_BE_INITIALIZED!>var e30: Int<!>; get() = 1;                  <!MUST_BE_INITIALIZED!>var e31: Int<!>; set(v) { field = v } get() = 1;                              <!MUST_BE_INITIALIZED!>var e32: Int<!>; set get() = 1;                                        var e33: Int; set(v) {} get() = 1;
                                                   var c30: Int = 1; get() = 1;                                        var c31: Int = 1; set(v) { field = v } get() = 1;                                                    var c32: Int = 1; set get() = 1;                                       var c33: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>1<!>; set(v) {} get() = 1;
                                          override var b30: Int; get() = 1;            override <!MUST_BE_INITIALIZED!>var b31: Int<!>; set(v) { field = v } get() = 1;                                            override var b32: Int; set get() = 1;                                  override var b33: Int; set(v) {} get() = 1;
                   override <!MUST_BE_INITIALIZED!>var f30: Int<!>; get() = 1;         override <!MUST_BE_INITIALIZED!>var f31: Int<!>; set(v) { field = v } get() = 1;                     override <!MUST_BE_INITIALIZED!>var f32: Int<!>; set get() = 1;                               override var f33: Int; set(v) {} get() = 1;
                                          override var d30: Int = 1; get() = 1;                               override var d31: Int = 1; set(v) { field = v } get() = 1;                                           override var d32: Int = 1; set get() = 1;                              override var d33: Int = <!PROPERTY_INITIALIZER_NO_BACKING_FIELD!>1<!>; set(v) {} get() = 1;

    init {
        a00 = 1
        a01 = 1
        a02 = 1
        a03 = 1
        a10 = 1
        a11 = 1
        a12 = 1
        a13 = 1
        a20 = 1
        a21 = 1
        a22 = 1
        a23 = 1
        a30 = 1
        a31 = 1
        a32 = 1
        a33 = 1

        b00 = 1
        b01 = 1
        b02 = 1
        b03 = 1
        b10 = 1
        b11 = 1
        b12 = 1
        b13 = 1
        b20 = 1
        b21 = 1
        b22 = 1
        b23 = 1
        b30 = 1
        b31 = 1
        b32 = 1
        b33 = 1
    }
}

interface I {
    val b00: Int
    val b01: Int
    val b02: Int
    val b03: Int
    val b10: Int
    val b11: Int
    val b12: Int
    val b13: Int
    val b20: Int
    val b21: Int
    val b22: Int
    val b23: Int
    val b30: Int
    val b31: Int
    val b32: Int
    val b33: Int

    val f00: Int
    val f01: Int
    val f02: Int
    val f03: Int
    val f10: Int
    val f11: Int
    val f12: Int
    val f13: Int
    val f20: Int
    val f21: Int
    val f22: Int
    val f23: Int
    val f30: Int
    val f31: Int
    val f32: Int
    val f33: Int

    val d00: Int
    val d01: Int
    val d02: Int
    val d03: Int
    val d10: Int
    val d11: Int
    val d12: Int
    val d13: Int
    val d20: Int
    val d21: Int
    val d22: Int
    val d23: Int
    val d30: Int
    val d31: Int
    val d32: Int
    val d33: Int
}

/* GENERATED_FIR_TAGS: assignment, classDeclaration, getter, init, integerLiteral, interfaceDeclaration, override,
propertyDeclaration, setter */
