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 _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method toString() → core::String*; -> core::Object::toString
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get 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 _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method toString() → core::String*; -> core::Object::toString
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get 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 _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method toString() → core::String*; -> core::Object::toString
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get 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 _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method toString() → core::String*; -> core::Object::toString
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get 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 _identityHashCode() → core::int*; -> core::Object::_identityHashCode
  abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
  abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
  abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
  abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
  abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
  abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
  abstract member-signature method toString() → core::String*; -> core::Object::toString
  abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
  abstract member-signature get 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|[](lowered final self::OptOutClass1* #this, core::int* index) → core::int*
  return index;
static method OptOutExtension|[]=(lowered 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(() → Null => null);
  self::expect(0, uns::unnecessaryIfNull(() → core::int* => 0, () → core::int* => 42));
  self::expect(42, uns::unnecessaryIfNull(() → 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(() → Null => null);
  self::throws(() → dynamic => uns::callReturningNever(() → <BottomType>=> throw "foo"), (core::Object* e) → core::bool* => e.{core::Object::==}("foo"));
  () →* Null f = () → 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|[](lowered final uns::OptInClass1 #this, core::int index) → core::int
  return index;
static method OptInExtension|[]=(lowered 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]
}


Constructor coverage from constants:
org-dartlang-testcase:///unsound_checks_lib.dart:
- E. (from org-dartlang-testcase:///unsound_checks_lib.dart:145:6)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
