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

static method main() → dynamic {
  lowered has-declared-initializer core::int? #lateLocal;
  function #lateLocal#get() → core::int
    return let final core::int? #t1 = #lateLocal in #t1 == null ?{core::int} #lateLocal = 123 : #t1{core::int};
  function #lateLocal#set(core::int lateLocal#param) → dynamic
    return #lateLocal = lateLocal#param;
  self::expect(123, #lateLocal#get(){() → core::int});
  self::expect(124, #lateLocal#set(124){(core::int) → dynamic});
  self::expect(124, #lateLocal#get(){() → core::int});
  function local<T extends core::Object? = dynamic>(T% value1, T% value2) → Null {
    lowered has-declared-initializer T? #lateGenericLocal;
    lowered core::bool #lateGenericLocal#isSet = false;
    function #lateGenericLocal#get() → T% {
      if(!#lateGenericLocal#isSet) {
        #lateGenericLocal = value1;
        #lateGenericLocal#isSet = true;
      }
      return #lateGenericLocal{T%};
    }
    function #lateGenericLocal#set(T% lateGenericLocal#param) → dynamic {
      #lateGenericLocal#isSet = true;
      return #lateGenericLocal = lateGenericLocal#param;
    }
    self::expect(value1, #lateGenericLocal#get(){() → T%});
    self::expect(value2, #lateGenericLocal#set(value2){(T%) → dynamic});
    self::expect(value2, #lateGenericLocal#get(){() → T%});
  }
  local<core::int?>(null, 0){(core::int?, core::int?) → Null};
  local<core::int?>(0, null){(core::int?, core::int?) → Null};
  local<core::int>(0, 42){(core::int, 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}";
}
