library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/nnbd/shorting_null_check.dart:12:24: Warning: Operand of null-aware operation '!' has type 'int' which excludes null.
// int? test1(A? a) => a?.zero!;
//                        ^
//
// pkg/front_end/testcases/nnbd/shorting_null_check.dart:14:25: Warning: Operand of null-aware operation '!' has type 'int' which excludes null.
// bool? test3(A? a) => a?.zero!.isEven;
//                         ^
//
import self as self;
import "dart:core" as core;

class A extends core::Object {
  field core::int zero;
  field core::int? zeroOrNull;
  constructor •(core::int zero, [core::int? zeroOrNull = #C1]) → self::A
    : self::A::zero = zero, self::A::zeroOrNull = zeroOrNull, super core::Object::•()
    ;
}
class Foo extends core::Object {
  field self::Bar? bar;
  constructor •(self::Bar? bar) → self::Foo
    : self::Foo::bar = bar, super core::Object::•()
    ;
  operator [](core::int? index) → self::Bar?
    return !index.{core::num::==}(null) ?{self::Bar?} new self::Bar::•(index{core::int}) : null;
}
class Bar extends core::Object {
  field core::int baz;
  constructor •(core::int baz) → self::Bar
    : self::Bar::baz = baz, super core::Object::•()
    ;
  operator [](core::int index) → core::int
    return index;
  operator ==(core::Object other) → core::bool
    return other is{ForNonNullableByDefault} self::Bar && this.{self::Bar::baz}.{core::num::==}(other{self::Bar}.{self::Bar::baz});
}
static method test1(self::A? a) → core::int?
  return let final self::A? #t1 = a in #t1.{core::Object::==}(null) ?{core::int?} null : #t1{self::A}.{self::A::zero}!;
static method test2(self::A? a) → core::int?
  return let final self::A? #t2 = a in #t2.{core::Object::==}(null) ?{core::int?} null : #t2{self::A}.{self::A::zeroOrNull}!;
static method test3(self::A? a) → core::bool?
  return let final self::A? #t3 = a in #t3.{core::Object::==}(null) ?{core::bool?} null : #t3{self::A}.{self::A::zero}!.{core::int::isEven};
static method test4(self::A? a) → core::bool?
  return let final self::A? #t4 = a in #t4.{core::Object::==}(null) ?{core::bool?} null : #t4{self::A}.{self::A::zeroOrNull}!.{core::int::isEven};
static method test5(self::Foo? foo) → self::Bar?
  return let final self::Foo? #t5 = foo in #t5.{core::Object::==}(null) ?{self::Bar?} null : #t5{self::Foo}.{self::Foo::bar}!;
static method test6(self::Foo? foo) → core::int?
  return let final self::Foo? #t6 = foo in #t6.{core::Object::==}(null) ?{core::int?} null : #t6{self::Foo}.{self::Foo::bar}!.{self::Bar::baz};
static method test7(self::Foo? foo, core::int baz) → core::int?
  return let final self::Foo? #t7 = foo in #t7.{core::Object::==}(null) ?{core::int?} null : #t7{self::Foo}.{self::Foo::bar}!.{self::Bar::[]}(baz);
static method test8(self::Foo? foo, core::int? bar) → self::Bar?
  return let final self::Foo? #t8 = foo in #t8.{core::Object::==}(null) ?{self::Bar?} null : #t8{self::Foo}.{self::Foo::[]}(bar)!;
static method test9(self::Foo? foo, core::int? bar) → core::int?
  return let final self::Foo? #t9 = foo in #t9.{core::Object::==}(null) ?{core::int?} null : #t9{self::Foo}.{self::Foo::[]}(bar)!.{self::Bar::baz};
static method test10(self::Foo? foo, core::int? bar, core::int baz) → dynamic
  return let final self::Foo? #t10 = foo in #t10.{core::Object::==}(null) ?{core::int?} null : #t10{self::Foo}.{self::Foo::[]}(bar)!.{self::Bar::[]}(baz);
static method main() → dynamic {
  self::expect(0, self::test1(new self::A::•(0)));
  self::expect(null, self::test1(null));
  self::expect(0, self::test2(new self::A::•(0, 0)));
  self::expect(null, self::test2(null));
  self::throws(() → core::int? => self::test2(new self::A::•(0, null)));
  self::expect(true, self::test3(new self::A::•(0)));
  self::expect(null, self::test3(null));
  self::expect(true, self::test4(new self::A::•(0, 0)));
  self::expect(null, self::test4(null));
  self::throws(() → core::bool? => self::test4(new self::A::•(0, null)));
  self::expect(new self::Bar::•(0), self::test5(new self::Foo::•(new self::Bar::•(0))));
  self::expect(null, self::test5(null));
  self::throws(() → self::Bar? => self::test5(new self::Foo::•(null)));
  self::expect(0, self::test6(new self::Foo::•(new self::Bar::•(0))));
  self::expect(null, self::test6(null));
  self::throws(() → core::int? => self::test6(new self::Foo::•(null)));
  self::expect(42, self::test7(new self::Foo::•(new self::Bar::•(0)), 42));
  self::expect(null, self::test7(null, 42));
  self::throws(() → core::int? => self::test7(new self::Foo::•(null), 42));
  self::expect(new self::Bar::•(42), self::test8(new self::Foo::•(new self::Bar::•(0)), 42));
  self::expect(null, self::test8(null, 42));
  self::throws(() → self::Bar? => self::test8(new self::Foo::•(new self::Bar::•(0)), null));
  self::expect(42, self::test9(new self::Foo::•(new self::Bar::•(0)), 42));
  self::expect(null, self::test9(null, 42));
  self::throws(() → core::int? => self::test9(new self::Foo::•(new self::Bar::•(0)), null));
  self::expect(87, self::test10(new self::Foo::•(new self::Bar::•(0)), 42, 87));
  self::expect(null, self::test10(null, 42, 87));
  self::throws(() → dynamic => self::test10(new self::Foo::•(new self::Bar::•(0)), null, 87));
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!expected.{core::Object::==}(actual))
    throw "Expected ${expected}, actual ${actual}";
}
static method throws(() → void f) → dynamic {
  try {
    f.call();
  }
  on core::Object catch(final core::Object _) {
    return;
  }
  throw "Missing exception";
}

constants  {
  #C1 = null
}
