Files
sdk/pkg/front_end/testcases/nnbd/shorting_null_check.dart
T
Johnni Winther e8683d25ed [cfe] Include null check in shorting
Change-Id: Id0f96b5a2c40e37ded46c761612f2cbb8828ad18
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/161787
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
2020-09-29 16:27:06 +00:00

94 lines
2.3 KiB
Dart

// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
class A {
int zero;
int? zeroOrNull;
A(this.zero, [this.zeroOrNull]);
}
int? test1(A? a) => a?.zero!;
int? test2(A? a) => a?.zeroOrNull!;
bool? test3(A? a) => a?.zero!.isEven;
bool? test4(A? a) => a?.zeroOrNull!.isEven;
class Foo {
Bar? bar;
Foo(this.bar);
Bar? operator [](int? index) => index != null ? new Bar(index) : null;
}
class Bar {
int baz;
Bar(this.baz);
int operator [](int index) => index;
bool operator ==(Object other) => other is Bar && baz == other.baz;
}
Bar? test5(Foo? foo) => foo?.bar!;
int? test6(Foo? foo) => foo?.bar!.baz;
int? test7(Foo? foo, int baz) => foo?.bar![baz];
Bar? test8(Foo? foo, int? bar) => foo?[bar]!;
int? test9(Foo? foo, int? bar) => foo?[bar]!.baz;
test10(Foo? foo, int? bar, int baz) => foo?[bar]![baz];
main() {
expect(0, test1(new A(0)));
expect(null, test1(null));
expect(0, test2(new A(0, 0)));
expect(null, test2(null));
throws(() => test2(new A(0, null)));
expect(true, test3(new A(0)));
expect(null, test3(null));
expect(true, test4(new A(0, 0)));
expect(null, test4(null));
throws(() => test4(new A(0, null)));
expect(new Bar(0), test5(new Foo(new Bar(0))));
expect(null, test5(null));
throws(() => test5(new Foo(null)));
expect(0, test6(new Foo(new Bar(0))));
expect(null, test6(null));
throws(() => test6(new Foo(null)));
expect(42, test7(new Foo(new Bar(0)), 42));
expect(null, test7(null, 42));
throws(() => test7(new Foo(null), 42));
expect(new Bar(42), test8(new Foo(new Bar(0)), 42));
expect(null, test8(null, 42));
throws(() => test8(new Foo(new Bar(0)), null));
expect(42, test9(new Foo(new Bar(0)), 42));
expect(null, test9(null, 42));
throws(() => test9(new Foo(new Bar(0)), null));
expect(87, test10(new Foo(new Bar(0)), 42, 87));
expect(null, test10(null, 42, 87));
throws(() => test10(new Foo(new Bar(0)), null, 87));
}
expect(expected, actual) {
if (expected != actual) throw 'Expected $expected, actual $actual';
}
throws(void Function() f) {
try {
f();
} catch (_) {
return;
}
throw 'Missing exception';
}