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 #t2) → dynamic
    if(#lateLocal == null)
      return #lateLocal = #t2;
    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% #t3) → dynamic
      if(#lateGenericLocal#isSet)
        throw new _in::LateError::localAI("lateGenericLocal");
      else {
        #lateGenericLocal#isSet = true;
        return #lateGenericLocal = #t3;
      }
    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}";
}
