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 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 core::int? #t8 = null in _in::isSentinel(#nullableFinalTopLevelLocalWithInitializer) ?{core::int?} #nullableFinalTopLevelLocalWithInitializer = #t8 : throw new _in::LateError::localADI("nullableFinalTopLevelLocalWithInitializer") : #t7;
  lowered final 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 {}
