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

static method test() → dynamic {
  lowered core::int? #nullableTopLevelLocal = _in::createSentinel<core::int?>();
  function #nullableTopLevelLocal#get() → core::int?
    return let final core::int? #t1 = #nullableTopLevelLocal in _in::isSentinel(#t1) ?{core::int?} throw new _in::LateError::localNI("nullableTopLevelLocal") : #t1{core::int?};
  function #nullableTopLevelLocal#set(core::int? nullableTopLevelLocal#param) → dynamic
    return #nullableTopLevelLocal = nullableTopLevelLocal#param;
  lowered core::int? #nonNullableTopLevelLocal;
  function #nonNullableTopLevelLocal#get() → core::int
    return let final core::int? #t2 = #nonNullableTopLevelLocal in #t2 == null ?{core::int} throw new _in::LateError::localNI("nonNullableTopLevelLocal") : #t2{core::int};
  function #nonNullableTopLevelLocal#set(core::int nonNullableTopLevelLocal#param) → dynamic
    return #nonNullableTopLevelLocal = nonNullableTopLevelLocal#param;
  lowered core::int? #nullableTopLevelLocalWithInitializer = _in::createSentinel<core::int?>();
  function #nullableTopLevelLocalWithInitializer#get() → core::int?
    return let final core::int? #t3 = #nullableTopLevelLocalWithInitializer in _in::isSentinel(#t3) ?{core::int?} #nullableTopLevelLocalWithInitializer = null : #t3{core::int?};
  function #nullableTopLevelLocalWithInitializer#set(core::int? nullableTopLevelLocalWithInitializer#param) → dynamic
    return #nullableTopLevelLocalWithInitializer = nullableTopLevelLocalWithInitializer#param;
  lowered has-declared-initializer core::int? #nonNullableTopLevelLocalWithInitializer;
  function #nonNullableTopLevelLocalWithInitializer#get() → core::int
    return let final core::int? #t4 = #nonNullableTopLevelLocalWithInitializer in #t4 == null ?{core::int} #nonNullableTopLevelLocalWithInitializer = 0 : #t4{core::int};
  function #nonNullableTopLevelLocalWithInitializer#set(core::int nonNullableTopLevelLocalWithInitializer#param) → dynamic
    return #nonNullableTopLevelLocalWithInitializer = nonNullableTopLevelLocalWithInitializer#param;
  lowered final core::int? #nullableFinalTopLevelLocal = _in::createSentinel<core::int?>();
  function #nullableFinalTopLevelLocal#get() → core::int?
    return let final core::int? #t5 = #nullableFinalTopLevelLocal in _in::isSentinel(#t5) ?{core::int?} throw new _in::LateError::localNI("nullableFinalTopLevelLocal") : #t5{core::int?};
  function #nullableFinalTopLevelLocal#set(core::int? nullableFinalTopLevelLocal#param) → dynamic
    if(_in::isSentinel(#nullableFinalTopLevelLocal))
      return #nullableFinalTopLevelLocal = nullableFinalTopLevelLocal#param;
    else
      throw new _in::LateError::localAI("nullableFinalTopLevelLocal");
  lowered final core::int? #nonNullableFinalTopLevelLocal;
  function #nonNullableFinalTopLevelLocal#get() → core::int
    return let final core::int? #t6 = #nonNullableFinalTopLevelLocal in #t6 == null ?{core::int} throw new _in::LateError::localNI("nonNullableFinalTopLevelLocal") : #t6{core::int};
  function #nonNullableFinalTopLevelLocal#set(core::int nonNullableFinalTopLevelLocal#param) → dynamic
    if(#nonNullableFinalTopLevelLocal == null)
      return #nonNullableFinalTopLevelLocal = nonNullableFinalTopLevelLocal#param;
    else
      throw new _in::LateError::localAI("nonNullableFinalTopLevelLocal");
  lowered final core::int? #nullableFinalTopLevelLocalWithInitializer = _in::createSentinel<core::int?>();
  function #nullableFinalTopLevelLocalWithInitializer#get() → core::int?
    return let final core::int? #t7 = #nullableFinalTopLevelLocalWithInitializer in _in::isSentinel(#t7) ?{core::int?} let final has-declared-initializer core::int? #t8 = null in _in::isSentinel(#nullableFinalTopLevelLocalWithInitializer) ?{core::int?} #nullableFinalTopLevelLocalWithInitializer = #t8 : throw new _in::LateError::localADI("nullableFinalTopLevelLocalWithInitializer") : #t7;
  lowered final has-declared-initializer core::int? #nonNullableFinalTopLevelLocalWithInitializer;
  function #nonNullableFinalTopLevelLocalWithInitializer#get() → core::int
    return let final core::int? #t9 = #nonNullableFinalTopLevelLocalWithInitializer in #t9 == null ?{core::int} let final core::int #t10 = 0 in #nonNullableFinalTopLevelLocalWithInitializer == null ?{core::int} #nonNullableFinalTopLevelLocalWithInitializer = #t10 : throw new _in::LateError::localADI("nonNullableFinalTopLevelLocalWithInitializer") : #t9{core::int};
  lowered Null #neverLocal;
  function #neverLocal#get() → Never
    return let final Never? #t11 = #neverLocal in #t11 == null ?{Never} throw new _in::LateError::localNI("neverLocal") : #t11{Never};
  function #neverLocal#set(Never neverLocal#param) → dynamic
    return #neverLocal = neverLocal#param;
}
static method main() → dynamic {}
