library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "dart:_internal" as _in;

class Class extends core::Object {
  field core::int? _#Class#field1 = null;
  field core::int? _#Class#field2 = null;
  field core::int? _#Class#field3 = null;
  field core::int? _#Class#field4 = null;
  synthetic constructor •() → self::Class
    : super core::Object::•()
    ;
  get field1() → core::int
    return let final core::int? #t1 = this.{self::Class::_#Class#field1}{core::int?} in #t1 == null ?{core::int} throw new _in::LateError::fieldNI("field1") : #t1{core::int};
  set field1(core::int field1#param) → void
    this.{self::Class::_#Class#field1} = field1#param;
  get field2() → core::int
    return let final core::int? #t2 = this.{self::Class::_#Class#field2}{core::int?} in #t2 == null ?{core::int} throw new _in::LateError::fieldNI("field2") : #t2{core::int};
  set field2(core::int field2#param) → void
    this.{self::Class::_#Class#field2} = field2#param;
  get field3() → core::int
    return let final core::int? #t3 = this.{self::Class::_#Class#field3}{core::int?} in #t3 == null ?{core::int} throw new _in::LateError::fieldNI("field3") : #t3{core::int};
  set field3(core::int field3#param) → void
    if(this.{self::Class::_#Class#field3}{core::int?} == null)
      this.{self::Class::_#Class#field3} = field3#param;
    else
      throw new _in::LateError::fieldAI("field3");
  get field4() → core::int
    return let final core::int? #t4 = this.{self::Class::_#Class#field4}{core::int?} in #t4 == null ?{core::int} throw new _in::LateError::fieldNI("field4") : #t4{core::int};
  set field4(core::int field4#param) → void
    if(this.{self::Class::_#Class#field4}{core::int?} == null)
      this.{self::Class::_#Class#field4} = field4#param;
    else
      throw new _in::LateError::fieldAI("field4");
}
class SubClass extends self::Class {
  field core::int? _#SubClass#field1 = null;
  field core::int? _#SubClass#field2 = null;
  field core::int? _#SubClass#field3 = null;
  field core::int? _#SubClass#field4 = null;
  synthetic constructor •() → self::SubClass
    : super self::Class::•()
    ;
  get field1() → core::int
    return let final core::int? #t5 = this.{self::SubClass::_#SubClass#field1}{core::int?} in #t5 == null ?{core::int} throw new _in::LateError::fieldNI("field1") : #t5{core::int};
  set field1(core::int field1#param) → void
    this.{self::SubClass::_#SubClass#field1} = field1#param;
  get field2() → core::int
    return let final core::int? #t6 = this.{self::SubClass::_#SubClass#field2}{core::int?} in #t6 == null ?{core::int} this.{self::SubClass::_#SubClass#field2} = 0 : #t6{core::int};
  set field2(core::int field2#param) → void
    this.{self::SubClass::_#SubClass#field2} = field2#param;
  get field3() → core::int
    return let final core::int? #t7 = this.{self::SubClass::_#SubClass#field3}{core::int?} in #t7 == null ?{core::int} throw new _in::LateError::fieldNI("field3") : #t7{core::int};
  set field3(core::int field3#param) → void
    if(this.{self::SubClass::_#SubClass#field3}{core::int?} == null)
      this.{self::SubClass::_#SubClass#field3} = field3#param;
    else
      throw new _in::LateError::fieldAI("field3");
  get field4() → core::int
    return let final core::int? #t8 = this.{self::SubClass::_#SubClass#field4}{core::int?} in #t8 == null ?{core::int} let final core::int #t9 = 0 in this.{self::SubClass::_#SubClass#field4}{core::int?} == null ?{core::int} this.{self::SubClass::_#SubClass#field4} = #t9 : throw new _in::LateError::fieldADI("field4") : #t8{core::int};
  get directField1() → core::int
    return super.{self::Class::field1};
  set directField1(core::int value) → void {
    super.{self::Class::field1} = value;
  }
  get directField2() → core::int
    return super.{self::Class::field2};
  set directField2(core::int value) → void {
    super.{self::Class::field2} = value;
  }
  get directField3() → core::int
    return super.{self::Class::field3};
  get directField4() → core::int
    return super.{self::Class::field4};
}
static method main() → dynamic {
  self::SubClass sc = new self::SubClass::•();
  self::Class c = sc;
  self::throws(() → core::int => c.{self::Class::field1}{core::int}, "Read value from uninitialized SubClass.field1");
  self::throws(() → core::int => sc.{self::SubClass::directField1}{core::int}, "Read value from uninitialized Class.field1");
  self::expect(42, c.{self::Class::field1} = 42);
  self::expect(42, c.{self::Class::field1}{core::int});
  self::throws(() → core::int => sc.{self::SubClass::directField1}{core::int}, "Read value from uninitialized Class.field1");
  self::expect(87, sc.{self::SubClass::directField1} = 87);
  self::expect(87, sc.{self::SubClass::directField1}{core::int});
  self::expect(0, c.{self::Class::field2}{core::int});
  self::throws(() → core::int => sc.{self::SubClass::directField2}{core::int}, "Read value from uninitialized Class.field2");
  self::expect(42, c.{self::Class::field2} = 42);
  self::expect(42, c.{self::Class::field2}{core::int});
  self::throws(() → core::int => sc.{self::SubClass::directField2}{core::int}, "Read value from uninitialized Class.field2");
  self::expect(87, sc.{self::SubClass::directField2} = 87);
  self::expect(87, sc.{self::SubClass::directField2}{core::int});
  self::throws(() → core::int => c.{self::Class::field3}{core::int}, "Read value from uninitialized SubClass.field3");
  self::throws(() → core::int => sc.{self::SubClass::directField3}{core::int}, "Read value from uninitialized Class.field3");
  self::expect(42, c.{self::Class::field3} = 42);
  self::expect(42, c.{self::Class::field3}{core::int});
  self::throws(() → core::int => sc.{self::SubClass::directField3}{core::int}, "Read value from uninitialized Class.field3");
  self::throws(() → core::int => c.{self::Class::field3} = 87, "Write value to initialized SubClass.field3");
  self::expect(0, c.{self::Class::field4}{core::int});
  self::throws(() → core::int => sc.{self::SubClass::directField4}{core::int}, "Read value from uninitialized Class.field4");
  self::expect(42, c.{self::Class::field4} = 42);
  self::expect(0, c.{self::Class::field4}{core::int});
  self::expect(42, sc.{self::SubClass::directField4}{core::int});
  self::throws(() → core::int => c.{self::Class::field4} = 87, "Write value to initialized SubClass.field4");
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
    throw "Expected ${expected}, actual ${actual}.";
}
static method throws(() → dynamic f, core::String message) → dynamic {
  dynamic value;
  try {
    value = f(){() → dynamic};
  }
  on core::Error catch(final core::Error e) {
    core::print(e);
    return;
  }
  throw "${message}: ${value}";
}


Extra constant evaluation status:
Evaluated: VariableGet @ org-dartlang-testcase:///override.dart:16:18 -> IntConstant(0)
Extra constant evaluation: evaluated: 232, effectively constant: 1
