blob: af891e250f40ece3c659f6ca8cd70063e256f85d [file] [log] [blame]
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(() void => 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(() void => 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(() void => 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(() void => 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(() void => 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(() void => 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(() void => 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(() void => 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
}