library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "dart:_internal" as _in;
import "late_statics_lib.dart" as lat;
additionalExports = (lat::a,
  lat::a,
  lat::b,
  lat::b,
  lat::c,
  lat::c,
  lat::d)

import "org-dartlang-testcase:///late_statics_lib.dart" as lib;
export "org-dartlang-testcase:///late_statics_lib.dart";

class Statics extends core::Object {
  late static field core::int a;
  late static final [setter] field core::int b;
  static field core::int? _#c = _in::createSentinel<core::int>();
  static field core::int? _#d = _in::createSentinel<core::int>();
  synthetic constructor •() → self::Statics
    : super core::Object::•()
    ;
  static get c() → core::int
    return let final core::int? #t1 = self::Statics::_#c in _in::isSentinel(#t1) ?{core::int} self::Statics::_#c = 1.{core::int::unary-}(){() → core::int} : #t1{core::int};
  static set c(core::int #t2) → void
    self::Statics::_#c = #t2;
  static get d() → core::int
    return let final core::int #t3 = self::Statics::_#d in _in::isSentinel(#t3) ?{core::int} let final core::int #t4 = 1.{core::int::unary-}(){() → core::int} in _in::isSentinel(self::Statics::_#d) ?{core::int} self::Statics::_#d = #t4 : throw new _in::LateError::fieldADI("d") : #t3;
}
static method main() → void {
  self::testUninitializedNonFinalStaticField();
  self::testUninitializedFinalStaticField();
  self::testInitializedNonFinalStaticField();
  self::testInitializedFinalStaticField();
  self::testUninitializedNonFinalTopLevelField();
  self::testUninitializedFinalTopLevelField();
  self::testInitializedNonFinalTopLevelField();
  self::testInitializedFinalTopLevelField();
}
static method testUninitializedNonFinalStaticField() → void {
  core::print(self::Statics::a);
  self::Statics::a = 42;
  core::print(self::Statics::a);
}
static method testUninitializedFinalStaticField() → void {
  core::print(self::Statics::b);
  self::Statics::b = 42;
  core::print(self::Statics::b);
}
static method testInitializedNonFinalStaticField() → void {
  core::print(self::Statics::c);
  self::Statics::c = 42;
  core::print(self::Statics::c);
}
static method testInitializedFinalStaticField() → void {
  core::print(self::Statics::d);
}
static method testUninitializedNonFinalTopLevelField() → void {
  core::print(lat::a);
  lat::a = 42;
  core::print(lat::a);
}
static method testUninitializedFinalTopLevelField() → void {
  core::print(lat::b);
  lat::b = 42;
  core::print(lat::b);
}
static method testInitializedNonFinalTopLevelField() → void {
  core::print(lat::c);
  lat::c = 42;
  core::print(lat::c);
}
static method testInitializedFinalTopLevelField() → void {
  core::print(lat::d);
}

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

late static field core::int a;
late static final [setter] field core::int b;
static field core::int? _#c = _in::createSentinel<core::int>();
static field core::int? _#d = _in::createSentinel<core::int>();
static get c() → core::int
  return let final core::int? #t5 = lat::_#c in _in::isSentinel(#t5) ?{core::int} lat::_#c = 1.{core::int::unary-}(){() → core::int} : #t5{core::int};
static set c(core::int #t6) → void
  lat::_#c = #t6;
static get d() → core::int
  return let final core::int #t7 = lat::_#d in _in::isSentinel(#t7) ?{core::int} let final core::int #t8 = 1.{core::int::unary-}(){() → core::int} in _in::isSentinel(lat::_#d) ?{core::int} lat::_#d = #t8 : throw new _in::LateError::fieldADI("d") : #t7;
