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

static method main() → dynamic {
  lowered core::int? #lateLocal;
  lowered core::bool #lateLocal#isSet = false;
  function #lateLocal#get() → core::int
    return #lateLocal#isSet ?{core::int} #lateLocal{core::int} : throw new _in::LateError::localNI("lateLocal");
  function #lateLocal#set(core::int #t1) → dynamic {
    #lateLocal#isSet = true;
    return #lateLocal = #t1;
  }
  self::throws(() → core::int => #lateLocal#get(){() → core::int}, "Read value from uninitialized lateLocal");
  self::expect(123, #lateLocal#set(123){(core::int) → dynamic});
  self::expect(123, #lateLocal#get(){() → core::int});
  function local<T extends core::Object? = dynamic>(T% value) → Null {
    lowered T? #lateGenericLocal;
    lowered core::bool #lateGenericLocal#isSet = false;
    function #lateGenericLocal#get() → T%
      return #lateGenericLocal#isSet ?{T%} #lateGenericLocal{T%} : throw new _in::LateError::localNI("lateGenericLocal");
    function #lateGenericLocal#set(T% #t2) → dynamic {
      #lateGenericLocal#isSet = true;
      return #lateGenericLocal = #t2;
    }
    self::throws(() → T% => #lateGenericLocal#get(){() → T%}, "Read value from uninitialized lateGenericLocal");
    self::expect(value, #lateGenericLocal#set(value){(T%) → dynamic});
    self::expect(value, #lateGenericLocal#get(){() → T%});
  }
  local<core::int?>(null){(core::int?) → Null};
  local<core::int?>(0){(core::int?) → Null};
  local<core::int>(0){(core::int) → Null};
}
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}";
}
