// @dart = 2.8
import 'unsound_checks_lib.dart';

class OptOutClass1 {}

class OptOutClass2 {
  int operator [](int index) => index;
  void operator []=(int index, int value) {}
}

class OptOutClass3 {
  OptOutClass3(this.field);
  int field;
}

class OptOutClass4 extends OptOutSuperClass4 {
  method(int i) => super[i] ??= 42;
  methodForEffect(int i) {}
}

class OptOutClass5 {
  OptOutClass5(this.field);
  int field;
}

class OptOutSuperClass4 {
  int operator [](int index) => index;
  void operator []=(int index, int value) {}
}

expect(expected, actual) {}

extension OptOutExtension on OptOutClass1 {
  int operator [](int index) => index;
  void operator []=(int index, int value) {}
}

extensionIfNullOptOut1(int i) => OptOutExtension(new OptOutClass1())[i] ??= 42;
extensionIfNullOptOut1ForEffect(int i) {}
extensionIfNullOptOut2(int i) => new OptOutClass1()[i] ??= 42;
extensionIfNullOptOut2ForEffect(int i) {}
ifNullIndexSetOptOut(int i) => new OptOutClass2()[i] ??= 42;
ifNullIndexSetOptOutForEffect(int i) {}
ifNullOptOut(int i) => i ?? 42;
ifNullPropertySetOptOut(int i) => new OptOutClass3(i).field ??= 42;
ifNullPropertySetOptOutForEffect(int i) {}
ifNullSetOptOut(int i) => i ??= 42;
ifNullSetOptOutForEffect(int i) {}
ifNullSuperIndexSetOptOut(int i) => new OptOutClass4().method(i);
ifNullSuperIndexSetOptOutForEffect(int i) {}
isNotNullOptOut1(int i) => i != null;
isNotNullOptOut2(int i) => null != i;
isNotTestOptOut(int i) => i is! int;
isNullOptOut1(int i) => i == null;
isNullOptOut2(int i) => null == i;
isTestOptOut(int i) => i is int;
main() {}
nullAwareIfNullSetOptOut(int i) {}
nullAwareIfNullSetOptOutForEffect(int i) {}
throws(void f(), [bool Function(Object) testException]) {}
