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

static method main() → dynamic {
  core::bool b = (() → core::bool => false)(){() → core::bool};
  lowered final core::int? #lateLocal;
  function #lateLocal#get() → core::int
    return let final core::int? #t1 = #lateLocal in #t1 == null ?{core::int} throw new _in::LateError::localNI("lateLocal") : #t1{core::int};
  function #lateLocal#set(core::int lateLocal#param) → dynamic
    if(#lateLocal == null)
      return #lateLocal = lateLocal#param;
    else
      throw new _in::LateError::localAI("lateLocal");
  if(b) {
    #lateLocal#set(123){(core::int) → dynamic};
  }
  self::throws(() → core::int => #lateLocal#get(){() → core::int}, "Read value from uninitialized lateLocal");
  if(!b) {
    self::expect(123, #lateLocal#set(123){(core::int) → dynamic});
    self::expect(123, #lateLocal#get(){() → core::int});
  }
  self::throws(() → core::int => #lateLocal#set(124){(core::int) → dynamic}, "Write value to initialized lateLocal");
  function local<T extends core::Object? = dynamic>(T% value) → Null {
    lowered final 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% lateGenericLocal#param) → dynamic
      if(#lateGenericLocal#isSet)
        throw new _in::LateError::localAI("lateGenericLocal");
      else {
        #lateGenericLocal#isSet = true;
        return #lateGenericLocal = lateGenericLocal#param;
      }
    if(b) {
      #lateGenericLocal#set(value){(T%) → dynamic};
    }
    self::throws(() → T% => #lateGenericLocal#get(){() → T%}, "Read value from uninitialized lateGenericLocal");
    if(!b) {
      self::expect(value, #lateGenericLocal#set(value){(T%) → dynamic});
      self::expect(value, #lateGenericLocal#get(){() → T%});
    }
    self::throws(() → T% => #lateGenericLocal#set(value){(T%) → dynamic}, "Write value to initialized lateGenericLocal");
  }
  local<core::int?>(null){(core::int?) → Null};
  local<core::int?>(42){(core::int?) → Null};
  local<core::int>(42){(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}";
}
