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

class C extends core::Object {
  field core::int _#C#a = _in::createSentinel<core::int>();
  field core::int _#C#b = _in::createSentinel<core::int>();
  field core::int _#C#c = _in::createSentinel<core::int>();
  field core::int _#C#d = _in::createSentinel<core::int>();
  synthetic constructor •() → self::C
    : super core::Object::•()
    ;
  static method _#new#tearOff() → self::C
    return new self::C::•();
  get a() → core::int
    return _la::_lateReadCheck<core::int>(this.{self::C::_#C#a}{core::int}, "a");
  set a(core::int value) → void
    this.{self::C::_#C#a} = value;
  get b() → core::int
    return _la::_lateReadCheck<core::int>(this.{self::C::_#C#b}{core::int}, "b");
  set b(core::int value) → void {
    _la::_lateWriteOnceCheck(this.{self::C::_#C#b}{core::int}, "b");
    this.{self::C::_#C#b} = value;
  }
  get c() → core::int {
    core::int value = this.{self::C::_#C#c}{core::int};
    if(_in::isSentinel(value))
      value = this.{self::C::_#C#c} = 1.{core::int::unary-}(){() → core::int};
    return value;
  }
  set c(core::int value) → void
    this.{self::C::_#C#c} = value;
  get d() → core::int {
    core::int value = this.{self::C::_#C#d}{core::int};
    if(_in::isSentinel(value)) {
      final core::int result = 1.{core::int::unary-}(){() → core::int};
      _la::_lateInitializeOnceCheck(this.{self::C::_#C#d}{core::int}, "d");
      value = this.{self::C::_#C#d} = result;
    }
    return value;
  }
}
static field self::C c = new self::C::•();
static method main() → void {
  self::testUninitializedNonFinalInstanceField();
  self::testUninitializedFinalInstanceField();
  self::testInitializedNonFinalInstanceField();
  self::testInitializedFinalInstanceField();
}
static method testUninitializedNonFinalInstanceField() → void {
  core::print(self::c.{self::C::a}{core::int});
  self::c.{self::C::a} = 42;
  core::print(self::c.{self::C::a}{core::int});
}
static method testUninitializedFinalInstanceField() → void {
  core::print(self::c.{self::C::b}{core::int});
  self::c.{self::C::b} = 42;
  core::print(self::c.{self::C::b}{core::int});
}
static method testInitializedNonFinalInstanceField() → void {
  core::print(self::c.{self::C::c}{core::int});
  self::c.{self::C::c} = 42;
  core::print(self::c.{self::C::c}{core::int});
}
static method testInitializedFinalInstanceField() → void {
  core::print(self::c.{self::C::d}{core::int});
}


Extra constant evaluation status:
Evaluated: InstanceInvocation @ org-dartlang-testcase:///late_fields.dart:15:16 -> DoubleConstant(-1.0)
Evaluated: InstanceInvocation @ org-dartlang-testcase:///late_fields.dart:16:22 -> DoubleConstant(-1.0)
Extra constant evaluation: evaluated: 77, effectively constant: 2
