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#A = _in::createSentinel<core::int>();
  field core::int _#C#b#F = _in::createSentinel<core::int>();
  field core::int _#C#c#AI = _in::createSentinel<core::int>();
  field core::int _#C#d#FI = _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#A}{core::int}, "a");
  set a(core::int value) → void
    this.{self::C::_#C#a#A} = value;
  get b() → core::int
    return _la::_lateReadCheck<core::int>(this.{self::C::_#C#b#F}{core::int}, "b");
  set b(core::int value) → void {
    _la::_lateWriteOnceCheck(this.{self::C::_#C#b#F}{core::int}, "b");
    this.{self::C::_#C#b#F} = value;
  }
  get c() → core::int {
    core::int value = this.{self::C::_#C#c#AI}{core::int};
    if(_in::isSentinel(value))
      value = this.{self::C::_#C#c#AI} = 1.{core::int::unary-}(){() → core::int};
    return value;
  }
  set c(core::int value) → void
    this.{self::C::_#C#c#AI} = value;
  get d() → core::int {
    core::int value = this.{self::C::_#C#d#FI}{core::int};
    if(_in::isSentinel(value)) {
      final core::int result = 1.{core::int::unary-}(){() → core::int};
      _la::_lateInitializeOnceCheck(this.{self::C::_#C#d#FI}{core::int}, "d");
      value = this.{self::C::_#C#d#FI} = 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
