library;
import self as self;
import "dart:core" as core;
import "unsound_checks_lib.dart" as uns;

import "org-dartlang-testcase:///unsound_checks_lib.dart";

class OptOutClass1 extends core::Object {
  synthetic constructor •() → self::OptOutClass1*
    : super core::Object::•()
    ;
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ toString() → core::String*; -> core::Object::toString
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
}
class OptOutClass2 extends core::Object {
  synthetic constructor •() → self::OptOutClass2*
    : super core::Object::•()
    ;
  operator [](core::int* index) → core::int*
    return index;
  operator []=(core::int* index, core::int* value) → void {}
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ toString() → core::String*; -> core::Object::toString
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
}
class OptOutClass3 extends core::Object {
  field core::int* field;
  constructor •(core::int* field) → self::OptOutClass3*
    : self::OptOutClass3::field = field, super core::Object::•()
    ;
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ toString() → core::String*; -> core::Object::toString
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
}
class OptOutSuperClass4 extends core::Object {
  synthetic constructor •() → self::OptOutSuperClass4*
    : super core::Object::•()
    ;
  operator [](core::int* index) → core::int*
    return index;
  operator []=(core::int* index, core::int* value) → void {}
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ toString() → core::String*; -> core::Object::toString
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
}
class OptOutClass4 extends self::OptOutSuperClass4 {
  synthetic constructor •() → self::OptOutClass4*
    : super self::OptOutSuperClass4::•()
    ;
  method method(core::int* i) → dynamic
    return let final core::int* #t1 = i in let final core::int* #t2 = super.{self::OptOutSuperClass4::[]}(#t1) in #t2.{core::num::==}(null) ?{core::int*} let final core::int* #t3 = 42 in let final void #t4 = super.{self::OptOutSuperClass4::[]=}(#t1, #t3) in #t3 : #t2;
  method methodForEffect(core::int* i) → dynamic {
    let final core::int* #t5 = i in super.{self::OptOutSuperClass4::[]}(#t5).{core::num::==}(null) ?{core::int*} super.{self::OptOutSuperClass4::[]=}(#t5, 42) : null;
  }
}
class OptOutClass5 extends core::Object {
  field core::int* field;
  constructor •(core::int* field) → self::OptOutClass5*
    : self::OptOutClass5::field = field, super core::Object::•()
    ;
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ toString() → core::String*; -> core::Object::toString
  abstract member-signature method /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get /* from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/object_patch.dart */ runtimeType() → core::Type*; -> core::Object::runtimeType
}
extension OptOutExtension on self::OptOutClass1* {
  operator [] = self::OptOutExtension|[];
  operator []= = self::OptOutExtension|[]=;
}
static method isNullOptOut1(core::int* i) → dynamic
  return i.{core::num::==}(null);
static method isNotNullOptOut1(core::int* i) → dynamic
  return !i.{core::num::==}(null);
static method isNullOptOut2(core::int* i) → dynamic
  return null.{core::Object::==}(i);
static method isNotNullOptOut2(core::int* i) → dynamic
  return !null.{core::Object::==}(i);
static method ifNullOptOut(core::int* i) → dynamic
  return let final core::int* #t6 = i in #t6.{core::num::==}(null) ?{core::int*} 42 : #t6;
static method OptOutExtension|[](final self::OptOutClass1* #this, core::int* index) → core::int*
  return index;
static method OptOutExtension|[]=(final self::OptOutClass1* #this, core::int* index, core::int* value) → void {}
static method extensionIfNullOptOut1(core::int* i) → dynamic
  return let final self::OptOutClass1* #t7 = new self::OptOutClass1::•() in let final core::int* #t8 = i in let final core::int* #t9 = self::OptOutExtension|[](#t7, #t8) in #t9.{core::num::==}(null) ?{core::int*} let final core::int* #t10 = 42 in let final void #t11 = self::OptOutExtension|[]=(#t7, #t8, #t10) in #t10 : #t9;
static method extensionIfNullOptOut1ForEffect(core::int* i) → dynamic {
  let final self::OptOutClass1* #t12 = new self::OptOutClass1::•() in let final core::int* #t13 = i in self::OptOutExtension|[](#t12, #t13).{core::num::==}(null) ?{core::int*} self::OptOutExtension|[]=(#t12, #t13, 42) : null;
}
static method extensionIfNullOptOut2(core::int* i) → dynamic
  return let final self::OptOutClass1* #t14 = new self::OptOutClass1::•() in let final core::int* #t15 = i in let final core::int* #t16 = self::OptOutExtension|[](#t14, #t15) in #t16.{core::num::==}(null) ?{core::int*} let final core::int* #t17 = 42 in let final void #t18 = self::OptOutExtension|[]=(#t14, #t15, #t17) in #t17 : #t16;
static method extensionIfNullOptOut2ForEffect(core::int* i) → dynamic {
  let final self::OptOutClass1* #t19 = new self::OptOutClass1::•() in let final core::int* #t20 = i in self::OptOutExtension|[](#t19, #t20).{core::num::==}(null) ?{core::int*} self::OptOutExtension|[]=(#t19, #t20, 42) : null;
}
static method ifNullIndexSetOptOut(core::int* i) → dynamic
  return let final self::OptOutClass2* #t21 = new self::OptOutClass2::•() in let final core::int* #t22 = i in let final core::int* #t23 = #t21.{self::OptOutClass2::[]}(#t22) in #t23.{core::num::==}(null) ?{core::int*} let final core::int* #t24 = 42 in let final void #t25 = #t21.{self::OptOutClass2::[]=}(#t22, #t24) in #t24 : #t23;
static method ifNullIndexSetOptOutForEffect(core::int* i) → dynamic {
  let final self::OptOutClass2* #t26 = new self::OptOutClass2::•() in let final core::int* #t27 = i in #t26.{self::OptOutClass2::[]}(#t27).{core::num::==}(null) ?{core::int*} #t26.{self::OptOutClass2::[]=}(#t27, 42) : null;
}
static method ifNullPropertySetOptOut(core::int* i) → dynamic
  return let final self::OptOutClass3* #t28 = new self::OptOutClass3::•(i) in let final core::int* #t29 = #t28.{self::OptOutClass3::field} in #t29.{core::num::==}(null) ?{core::int*} #t28.{self::OptOutClass3::field} = 42 : #t29;
static method ifNullPropertySetOptOutForEffect(core::int* i) → dynamic {
  let final self::OptOutClass3* #t30 = new self::OptOutClass3::•(i) in #t30.{self::OptOutClass3::field}.{core::num::==}(null) ?{core::int*} #t30.{self::OptOutClass3::field} = 42 : null;
}
static method ifNullSetOptOut(core::int* i) → dynamic
  return let final core::int* #t31 = i in #t31.{core::num::==}(null) ?{core::int*} i = 42 : #t31;
static method ifNullSetOptOutForEffect(core::int* i) → dynamic {
  i.{core::num::==}(null) ?{core::int*} i = 42 : null;
}
static method ifNullSuperIndexSetOptOut(core::int* i) → dynamic
  return new self::OptOutClass4::•().{self::OptOutClass4::method}(i);
static method ifNullSuperIndexSetOptOutForEffect(core::int* i) → dynamic {
  new self::OptOutClass4::•().{self::OptOutClass4::methodForEffect}(i);
}
static method nullAwareIfNullSetOptOut(core::int* i) → dynamic {
  self::OptOutClass5* o = new self::OptOutClass5::•(i);
  return let final self::OptOutClass5* #t32 = o in #t32.{self::OptOutClass5::==}(null) ?{core::int*} null : let final core::int* #t33 = #t32.{self::OptOutClass5::field} in #t33.{core::num::==}(null) ?{core::int*} #t32.{self::OptOutClass5::field} = 42 : #t33;
}
static method nullAwareIfNullSetOptOutForEffect(core::int* i) → dynamic {
  self::OptOutClass5* o = new self::OptOutClass5::•(i);
  let final self::OptOutClass5* #t34 = o in #t34.{self::OptOutClass5::==}(null) ?{core::int*} null : #t34.{self::OptOutClass5::field}.{core::num::==}(null) ?{core::int*} #t34.{self::OptOutClass5::field} = 42 : null;
}
static method isTestOptOut(core::int* i) → dynamic
  return i is core::int*;
static method isNotTestOptOut(core::int* i) → dynamic
  return !(i is core::int*);
static method main() → dynamic {
  self::expect(false, uns::isNullOptIn1(0));
  self::expect(false, self::isNullOptOut1(0));
  self::expect(true, uns::isNullOptIn1(null));
  self::expect(true, self::isNullOptOut1(null));
  self::expect(true, uns::isNotNullOptIn1(0));
  self::expect(true, self::isNotNullOptOut1(0));
  self::expect(false, uns::isNotNullOptIn1(null));
  self::expect(false, self::isNotNullOptOut1(null));
  self::expect(false, uns::isNullOptIn2(0));
  self::expect(false, self::isNullOptOut2(0));
  self::expect(true, uns::isNullOptIn2(null));
  self::expect(true, self::isNullOptOut2(null));
  self::expect(true, uns::isNotNullOptIn2(0));
  self::expect(true, self::isNotNullOptOut2(0));
  self::expect(false, uns::isNotNullOptIn2(null));
  self::expect(false, self::isNotNullOptOut2(null));
  self::expect(0, uns::ifNullOptIn(0));
  self::expect(0, self::ifNullOptOut(0));
  self::expect(42, uns::ifNullOptIn(null));
  self::expect(42, self::ifNullOptOut(null));
  self::expect(0, uns::extensionIfNullOptIn1(0));
  self::expect(0, self::extensionIfNullOptOut1(0));
  self::expect(42, uns::extensionIfNullOptIn1(null));
  self::expect(42, self::extensionIfNullOptOut1(null));
  uns::extensionIfNullOptIn1ForEffect(0);
  self::extensionIfNullOptOut1ForEffect(0);
  uns::extensionIfNullOptIn1ForEffect(null);
  self::extensionIfNullOptOut1ForEffect(null);
  self::expect(0, uns::extensionIfNullOptIn2(0));
  self::expect(0, self::extensionIfNullOptOut2(0));
  self::expect(42, uns::extensionIfNullOptIn2(null));
  self::expect(42, self::extensionIfNullOptOut2(null));
  uns::extensionIfNullOptIn2ForEffect(0);
  self::extensionIfNullOptOut2ForEffect(0);
  uns::extensionIfNullOptIn2ForEffect(null);
  self::extensionIfNullOptOut2ForEffect(null);
  self::expect(0, uns::ifNullIndexSetOptIn(0));
  self::expect(0, self::ifNullIndexSetOptOut(0));
  self::expect(42, uns::ifNullIndexSetOptIn(null));
  self::expect(42, self::ifNullIndexSetOptOut(null));
  uns::ifNullIndexSetOptInForEffect(0);
  self::ifNullIndexSetOptOutForEffect(0);
  uns::ifNullIndexSetOptInForEffect(null);
  self::ifNullIndexSetOptOutForEffect(null);
  self::expect(0, uns::ifNullPropertySetOptIn(0));
  self::expect(0, self::ifNullPropertySetOptOut(0));
  self::expect(42, uns::ifNullPropertySetOptIn(null));
  self::expect(42, self::ifNullPropertySetOptOut(null));
  uns::ifNullPropertySetOptInForEffect(0);
  self::ifNullPropertySetOptOutForEffect(0);
  uns::ifNullPropertySetOptInForEffect(null);
  self::ifNullPropertySetOptOutForEffect(null);
  self::expect(0, uns::ifNullSetOptIn(0));
  self::expect(0, self::ifNullSetOptOut(0));
  self::expect(42, uns::ifNullSetOptIn(null));
  self::expect(42, self::ifNullSetOptOut(null));
  uns::ifNullSetOptInForEffect(0);
  self::ifNullSetOptOutForEffect(0);
  uns::ifNullSetOptInForEffect(null);
  self::ifNullSetOptOutForEffect(null);
  self::expect(0, uns::ifNullSuperIndexSetOptIn(0));
  self::expect(0, self::ifNullSuperIndexSetOptOut(0));
  self::expect(42, uns::ifNullSuperIndexSetOptIn(null));
  self::expect(42, self::ifNullSuperIndexSetOptOut(null));
  uns::ifNullSuperIndexSetOptInForEffect(0);
  self::ifNullSuperIndexSetOptOutForEffect(0);
  uns::ifNullSuperIndexSetOptInForEffect(null);
  self::ifNullSuperIndexSetOptOutForEffect(null);
  self::expect(0, uns::nullAwareIfNullSetOptIn(0));
  self::expect(0, self::nullAwareIfNullSetOptOut(0));
  self::expect(42, uns::nullAwareIfNullSetOptIn(null));
  self::expect(42, self::nullAwareIfNullSetOptOut(null));
  uns::nullAwareIfNullSetOptInForEffect(0);
  self::nullAwareIfNullSetOptOutForEffect(0);
  uns::nullAwareIfNullSetOptInForEffect(null);
  self::nullAwareIfNullSetOptOutForEffect(null);
  self::expect(true, uns::isTestOptIn(0));
  self::expect(true, self::isTestOptOut(0));
  self::expect(false, uns::isTestOptIn(null));
  self::expect(false, self::isTestOptOut(null));
  self::expect(false, uns::isNotTestOptIn(0));
  self::expect(false, self::isNotTestOptOut(0));
  self::expect(true, uns::isNotTestOptIn(null));
  self::expect(true, self::isNotTestOptOut(null));
  self::expect(true, uns::nullAwareAccess1(0));
  self::expect(null, uns::nullAwareAccess1(null));
  uns::promotionToNever(0);
  uns::promotionToNever(null);
  uns::unnecessaryNullCheck(() → core::int* => 0);
  uns::unnecessaryNullCheck(() → core::Null? => null);
  self::expect(0, uns::unnecessaryIfNull(() → core::int* => 0, () → core::int* => 42));
  self::expect(42, uns::unnecessaryIfNull(() → core::Null? => null, () → core::int* => 42));
  uns::unnecessaryIfNullAssign(<core::int*>[0], () → core::int* => 42);
  uns::unnecessaryIfNullAssign(<core::int*>[null], () → core::int* => 42);
  uns::unnecessaryNullAwareAccess(() → core::int* => 0);
  uns::unnecessaryNullAwareAccess(() → core::Null? => null);
  self::throws(() → dynamic => uns::callReturningNever(() → <BottomType>=> throw "foo"), (core::Object* e) → core::bool* => e.{core::Object::==}("foo"));
  () →* core::Null? f = () → core::Null? => null;
  self::throws(() → dynamic => uns::callReturningNever(f));
  uns::switchOnEnum(#C3);
  uns::switchOnEnum(#C6);
  self::throws(() → dynamic => uns::switchOnEnum(null));
  uns::switchOnEnumWithBreak(#C3);
  uns::switchOnEnumWithBreak(#C6);
  self::throws(() → dynamic => uns::switchOnEnumWithBreak(null));
  uns::switchOnEnumWithFallThrough1(#C3);
  uns::switchOnEnumWithFallThrough1(#C6);
  self::throws(() → dynamic => uns::switchOnEnumWithFallThrough1(null));
  uns::switchOnEnumWithFallThrough2(#C3);
  uns::switchOnEnumWithFallThrough2(#C6);
  self::throws(() → dynamic => uns::switchOnEnumWithFallThrough2(null));
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!expected.{core::Object::==}(actual))
    throw "Expected ${expected}, actual ${actual}";
}
static method throws(() →* void f, [(core::Object*) →* core::bool* testException = #C7]) → dynamic {
  try {
    f.call();
  }
  on dynamic catch(final dynamic e) {
    if(!testException.{core::Object::==}(null) && !testException.call(e)) {
      throw "Unexpected exception: ${e}";
    }
    core::print(e);
    return;
  }
  throw "Missing exception.";
}

library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:13:23: Warning: Operand of null-aware operation '??' has type 'int' which excludes null.
// ifNullOptIn(int i) => i ?? 42;
//                       ^
//
// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:22:66: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
// extensionIfNullOptIn1(int i) => OptInExtension(new OptInClass1())[i] ??= 42;
//                                                                  ^
//
// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:25:36: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
//   OptInExtension(new OptInClass1())[i] ??= 42;
//                                    ^
//
// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:28:50: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
// extensionIfNullOptIn2(int i) => new OptInClass1()[i] ??= 42;
//                                                  ^
//
// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:31:20: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
//   new OptInClass1()[i] ??= 42;
//                    ^
//
// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:39:48: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
// ifNullIndexSetOptIn(int i) => new OptInClass2()[i] ??= 42;
//                                                ^
//
// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:42:20: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
//   new OptInClass2()[i] ??= 42;
//                    ^
//
// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:51:53: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
// ifNullPropertySetOptIn(int i) => new OptInClass3(i).field ??= 42;
//                                                     ^
//
// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:54:22: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
//   new OptInClass3(i).field ??= 42;
//                      ^
//
// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:57:26: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
// ifNullSetOptIn(int i) => i ??= 42;
//                          ^
//
// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:60:3: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
//   i ??= 42;
//   ^
//
// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:69:25: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
//   method(int i) => super[i] ??= 42;
//                         ^
//
// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:71:10: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
//     super[i] ??= 42;
//          ^
//
// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:113:28: Warning: Operand of null-aware operation '?.' has type 'int' which excludes null.
// nullAwareAccess1(int i) => i?.isEven;
//                            ^
//
// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:116:3: Warning: Operand of null-aware operation '?.' has type 'int' which excludes null.
//   i?.isEven;
//   ^
//
// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:128:11: Warning: Operand of null-aware operation '??' has type 'int' which excludes null.
//   return f() ??
//           ^
//
// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:134:4: Warning: Operand of null-aware operation '??=' has type 'int' which excludes null.
//   x[0] ??= f();
//    ^
//
// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:138:4: Warning: Operand of null-aware operation '?.' has type 'int' which excludes null.
//   f()?.gcd(0); // Should not throw if `f` returns null
//    ^
//
// pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:195:10: Error: Not enough type information to disambiguate between literal set and literal map.
// Try providing type arguments for the literal explicitly to disambiguate it.
//   return {...d}; // Should not throw ReachabilityError.
//          ^
//
import self as uns;
import "dart:core" as core;
import "dart:_internal" as _in;

class OptInClass1 extends core::Object {
  synthetic constructor •() → uns::OptInClass1
    : super core::Object::•()
    ;
}
class OptInClass2 extends core::Object {
  synthetic constructor •() → uns::OptInClass2
    : super core::Object::•()
    ;
  operator [](core::int index) → core::int
    return index;
  operator []=(core::int index, core::int value) → void {}
}
class OptInClass3 extends core::Object {
  field core::int field;
  constructor •(core::int field) → uns::OptInClass3
    : uns::OptInClass3::field = field, super core::Object::•()
    ;
}
class OptInSuperClass4 extends core::Object {
  synthetic constructor •() → uns::OptInSuperClass4
    : super core::Object::•()
    ;
  operator [](core::int index) → core::int
    return index;
  operator []=(core::int index, core::int value) → void {}
}
class OptInClass4 extends uns::OptInSuperClass4 {
  synthetic constructor •() → uns::OptInClass4
    : super uns::OptInSuperClass4::•()
    ;
  method method(core::int i) → dynamic
    return let final core::int #t35 = i in let final core::int #t36 = super.{uns::OptInSuperClass4::[]}(#t35) in #t36.{core::num::==}(null) ?{core::int} let final core::int #t37 = 42 in let final void #t38 = super.{uns::OptInSuperClass4::[]=}(#t35, #t37) in #t37 : #t36;
  method methodForEffect(core::int i) → dynamic {
    let final core::int #t39 = i in super.{uns::OptInSuperClass4::[]}(#t39).{core::num::==}(null) ?{core::int} super.{uns::OptInSuperClass4::[]=}(#t39, 42) : null;
  }
}
class OptInClass5 extends core::Object {
  field core::int field;
  constructor •(core::int field) → uns::OptInClass5
    : uns::OptInClass5::field = field, super core::Object::•()
    ;
}
class OptInClass6a extends core::Object {
  final field uns::OptInClass6b cls;
  constructor •(uns::OptInClass6b cls) → uns::OptInClass6a
    : uns::OptInClass6a::cls = cls, super core::Object::•()
    ;
}
class OptInClass6b extends core::Object {
  final field core::int field;
  constructor •(core::int field) → uns::OptInClass6b
    : uns::OptInClass6b::field = field, super core::Object::•()
    ;
}
class E extends core::Object /*isEnum*/  {
  final field core::int index;
  final field core::String _name;
  static const field core::List<uns::E> values = #C8;
  static const field uns::E e1 = #C3;
  static const field uns::E e2 = #C6;
  const constructor •(core::int index, core::String _name) → uns::E
    : uns::E::index = index, uns::E::_name = _name, super core::Object::•()
    ;
  method toString() → core::String
    return this.{uns::E::_name};
}
extension OptInExtension on uns::OptInClass1 {
  operator [] = uns::OptInExtension|[];
  operator []= = uns::OptInExtension|[]=;
}
static method isNullOptIn1(core::int i) → dynamic
  return i.{core::num::==}(null);
static method isNotNullOptIn1(core::int i) → dynamic
  return !i.{core::num::==}(null);
static method isNullOptIn2(core::int i) → dynamic
  return null.{core::Object::==}(i);
static method isNotNullOptIn2(core::int i) → dynamic
  return !null.{core::Object::==}(i);
static method ifNullOptIn(core::int i) → dynamic
  return let final core::int #t40 = i in #t40.{core::num::==}(null) ?{core::int} 42 : #t40;
static method OptInExtension|[](final uns::OptInClass1 #this, core::int index) → core::int
  return index;
static method OptInExtension|[]=(final uns::OptInClass1 #this, core::int index, core::int value) → void {}
static method extensionIfNullOptIn1(core::int i) → dynamic
  return let final uns::OptInClass1 #t41 = new uns::OptInClass1::•() in let final core::int #t42 = i in let final core::int #t43 = uns::OptInExtension|[](#t41, #t42) in #t43.{core::num::==}(null) ?{core::int} let final core::int #t44 = 42 in let final void #t45 = uns::OptInExtension|[]=(#t41, #t42, #t44) in #t44 : #t43;
static method extensionIfNullOptIn1ForEffect(core::int i) → dynamic {
  let final uns::OptInClass1 #t46 = new uns::OptInClass1::•() in let final core::int #t47 = i in uns::OptInExtension|[](#t46, #t47).{core::num::==}(null) ?{core::int} uns::OptInExtension|[]=(#t46, #t47, 42) : null;
}
static method extensionIfNullOptIn2(core::int i) → dynamic
  return let final uns::OptInClass1 #t48 = new uns::OptInClass1::•() in let final core::int #t49 = i in let final core::int #t50 = uns::OptInExtension|[](#t48, #t49) in #t50.{core::num::==}(null) ?{core::int} let final core::int #t51 = 42 in let final void #t52 = uns::OptInExtension|[]=(#t48, #t49, #t51) in #t51 : #t50;
static method extensionIfNullOptIn2ForEffect(core::int i) → dynamic {
  let final uns::OptInClass1 #t53 = new uns::OptInClass1::•() in let final core::int #t54 = i in uns::OptInExtension|[](#t53, #t54).{core::num::==}(null) ?{core::int} uns::OptInExtension|[]=(#t53, #t54, 42) : null;
}
static method ifNullIndexSetOptIn(core::int i) → dynamic
  return let final uns::OptInClass2 #t55 = new uns::OptInClass2::•() in let final core::int #t56 = i in let final core::int #t57 = #t55.{uns::OptInClass2::[]}(#t56) in #t57.{core::num::==}(null) ?{core::int} let final core::int #t58 = 42 in let final void #t59 = #t55.{uns::OptInClass2::[]=}(#t56, #t58) in #t58 : #t57;
static method ifNullIndexSetOptInForEffect(core::int i) → dynamic {
  let final uns::OptInClass2 #t60 = new uns::OptInClass2::•() in let final core::int #t61 = i in #t60.{uns::OptInClass2::[]}(#t61).{core::num::==}(null) ?{core::int} #t60.{uns::OptInClass2::[]=}(#t61, 42) : null;
}
static method ifNullPropertySetOptIn(core::int i) → dynamic
  return let final uns::OptInClass3 #t62 = new uns::OptInClass3::•(i) in let final core::int #t63 = #t62.{uns::OptInClass3::field} in #t63.{core::num::==}(null) ?{core::int} #t62.{uns::OptInClass3::field} = 42 : #t63;
static method ifNullPropertySetOptInForEffect(core::int i) → dynamic {
  let final uns::OptInClass3 #t64 = new uns::OptInClass3::•(i) in #t64.{uns::OptInClass3::field}.{core::num::==}(null) ?{core::int} #t64.{uns::OptInClass3::field} = 42 : null;
}
static method ifNullSetOptIn(core::int i) → dynamic
  return let final core::int #t65 = i in #t65.{core::num::==}(null) ?{core::int} i = 42 : #t65;
static method ifNullSetOptInForEffect(core::int i) → dynamic {
  i.{core::num::==}(null) ?{core::int} i = 42 : null;
}
static method ifNullSuperIndexSetOptIn(core::int i) → dynamic
  return new uns::OptInClass4::•().{uns::OptInClass4::method}(i);
static method ifNullSuperIndexSetOptInForEffect(core::int i) → dynamic {
  new uns::OptInClass4::•().{uns::OptInClass4::methodForEffect}(i);
}
static method nullAwareIfNullSetOptIn(core::int i) → dynamic {
  uns::OptInClass5? o = new uns::OptInClass5::•(i) as{ForNonNullableByDefault} uns::OptInClass5?;
  return let final uns::OptInClass5? #t66 = o in #t66.{core::Object::==}(null) ?{core::int?} null : let final core::int #t67 = #t66.{uns::OptInClass5::field} in #t67.{core::num::==}(null) ?{core::int} #t66.{uns::OptInClass5::field} = 42 : #t67;
}
static method nullAwareIfNullSetOptInForEffect(core::int i) → dynamic {
  uns::OptInClass5? o = new uns::OptInClass5::•(i) as{ForNonNullableByDefault} uns::OptInClass5?;
  let final uns::OptInClass5? #t68 = o in #t68.{core::Object::==}(null) ?{core::int?} null : #t68.{uns::OptInClass5::field}.{core::num::==}(null) ?{core::int} #t68.{uns::OptInClass5::field} = 42 : null;
}
static method isTestOptIn(core::int i) → dynamic
  return i is{ForNonNullableByDefault} core::int;
static method isNotTestOptIn(core::int i) → dynamic
  return !(i is{ForNonNullableByDefault} core::int);
static method nullAwareAccess1(core::int i) → dynamic
  return let final core::int #t69 = i in #t69.{core::num::==}(null) ?{core::bool?} null : #t69.{core::int::isEven};
static method nullAwareAccessForEffect1(core::int i) → dynamic {
  let final core::int #t70 = i in #t70.{core::num::==}(null) ?{core::bool?} null : #t70.{core::int::isEven};
}
static method promotionToNever(core::int i) → dynamic {
  if(i is{ForNonNullableByDefault} core::int)
    return;
}
static method unnecessaryNullCheck(() → core::int f) → dynamic {
  if(!f.call().{core::num::==}(null))
    return;
}
static method unnecessaryIfNull(() → core::int f, () → core::int g) → dynamic {
  return let final core::int #t71 = f.call() in #t71.{core::num::==}(null) ?{core::int} g.call() : #t71;
}
static method unnecessaryIfNullAssign(core::List<core::int> x, () → core::int f) → dynamic {
  let final core::List<core::int> #t72 = x in let final core::int #t73 = 0 in #t72.{core::List::[]}(#t73).{core::num::==}(null) ?{core::int} #t72.{core::List::[]=}(#t73, f.call()) : null;
}
static method unnecessaryNullAwareAccess(() → core::int f) → dynamic {
  let final core::int #t74 = f.call() in #t74.{core::num::==}(null) ?{core::int?} null : #t74.{core::int::gcd}(0);
}
static method callReturningNever(() → Never f) → dynamic {
  let final Never #t75 = f.call() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
}
static method switchOnEnum(uns::E e) → dynamic {
  switch(e) {
    #L1:
    case #C3:
      {
        return;
      }
    #L2:
    case #C6:
      {
        return;
      }
    #L3:
    default:
      throw new _in::ReachabilityError::•("`null` encountered as case in a switch expression with a non-nullable enum type.");
  }
}
static method switchOnEnumWithBreak(uns::E e) → dynamic {
  #L4:
  switch(e) {
    #L5:
    case #C3:
      {
        break #L4;
      }
    #L6:
    case #C6:
      {
        break #L4;
      }
    #L7:
    default:
      throw new _in::ReachabilityError::•("`null` encountered as case in a switch expression with a non-nullable enum type.");
  }
}
static method switchOnEnumWithFallThrough1(uns::E e) → dynamic {
  #L8:
  switch(e) {
    #L9:
    case #C3:
      {
        break #L8;
      }
    #L10:
    case #C6:
      {
        break #L8;
      }
    #L11:
    default:
      throw new _in::ReachabilityError::•("`null` encountered as case in a switch expression with a non-nullable enum type.");
  }
}
static method switchOnEnumWithFallThrough2(uns::E e) → dynamic {
  #L12:
  switch(e) {
    #L13:
    case #C3:
    case #C6:
      {
        break #L12;
      }
    #L14:
    default:
      throw new _in::ReachabilityError::•("`null` encountered as case in a switch expression with a non-nullable enum type.");
  }
}
static method handleThrow() → dynamic {
  throw "";
}
static method handleRethrow() → dynamic {
  try {
    uns::handleThrow();
  }
  on core::Object catch(final core::Object _) {
    rethrow;
  }
}
static method handleInvalid(dynamic d) → dynamic {
  return invalid-expression "pkg/front_end/testcases/nnbd_mixed/unsound_checks_lib.dart:195:10: Error: Not enough type information to disambiguate between literal set and literal map.
Try providing type arguments for the literal explicitly to disambiguate it.
  return {...d}; // Should not throw ReachabilityError.
         ^";
}

constants  {
  #C1 = 0
  #C2 = "E.e1"
  #C3 = uns::E {index:#C1, _name:#C2}
  #C4 = 1
  #C5 = "E.e2"
  #C6 = uns::E {index:#C4, _name:#C5}
  #C7 = null
  #C8 = <uns::E*>[#C3, #C6]
}
