c1a401c5da
Closes #44641. Closes #44246. Bug: https://github.com/dart-lang/sdk/issues/44641 Bug: https://github.com/dart-lang/sdk/issues/44246 Change-Id: I78cb0514a57ab3adafb3639b09ea8930791da030 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/179340 Commit-Queue: Dmitry Stefantsov <dmitryas@google.com> Reviewed-by: Johnni Winther <johnniwinther@google.com>
99 lines
4.2 KiB
Dart
99 lines
4.2 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.
|
|
|
|
import 'dart:async';
|
|
import 'constant_null_is_lib.dart';
|
|
|
|
final bool isWeakMode = const <Null>[] is List<Object>;
|
|
|
|
const c0 = null is int?;
|
|
const c1 = null is int;
|
|
const c2 = null is Null;
|
|
const c3 = null is Never?;
|
|
const c4 = null is Never;
|
|
const c5 = null is FutureOr<int?>;
|
|
const c6 = null is FutureOr<int>;
|
|
const c7 = null is FutureOr<int>?;
|
|
const c8 = null is FutureOr<Null>;
|
|
const c9 = null is FutureOr<Null>?;
|
|
const c10 = null is FutureOr<Never>;
|
|
const c11 = null is FutureOr<Never?>;
|
|
const c12 = null is FutureOr<Never>?;
|
|
const e1 = const Class<int>.constructor1(null);
|
|
const e2 = const Class<List<int>>.constructor1(<Null>[null]);
|
|
const e3 = const Class<Null>.constructor1(null);
|
|
const e4 = const Class<int>.constructor2(null);
|
|
const e5 = const Class<int?>.constructor2(null);
|
|
const e6 = const Class<Null>.constructor2(null);
|
|
const e7 = const Class<int>.constructor3(null);
|
|
const e8 = const Class<int?>.constructor3(null);
|
|
const e9 = const Class<Null>.constructor3(null);
|
|
const e10 = const Class<int>.constructor4(null);
|
|
const e11 = const Class<int?>.constructor4(null);
|
|
const e12 = const Class<Null>.constructor4(null);
|
|
|
|
class Class<T> {
|
|
final bool field;
|
|
|
|
const Class.constructor1(value) : field = value is T;
|
|
const Class.constructor2(value) : field = value is T?;
|
|
const Class.constructor3(value) : field = value is Class<T>;
|
|
const Class.constructor4(value) : field = value is Class<T>?;
|
|
}
|
|
|
|
main() {
|
|
expect(null is int?, c0, "null is int?");
|
|
expect(null is int, c1, "null is int");
|
|
expect(null is Null, c2, "null is Null");
|
|
expect(null is Never?, c3, "null is Never?");
|
|
expect(null is Never, c4, "null is Never");
|
|
expect(null is FutureOr<int?>, c5, "null is FutureOr<int?>");
|
|
expect(null is FutureOr<int>, c6, "null is FutureOr<int>");
|
|
expect(null is FutureOr<int>?, c7, "null is FutureOr<int>?");
|
|
expect(null is FutureOr<Null>, c8, "null is FutureOr<Null>");
|
|
expect(null is FutureOr<Null>?, c9, "null is FutureOr<Null>?");
|
|
expect(null is FutureOr<Never>, c10, "null is FutureOr<Never>");
|
|
expect(null is FutureOr<Never?>, c11, "null is FutureOr<Never?>");
|
|
expect(null is FutureOr<Never>?, c12, "null is FutureOr<Never>?");
|
|
expect(new Class<int>.constructor1(null).field, e1.field,
|
|
"Class<int>.constructor1(null).field");
|
|
expect(true, new Class<int?>.constructor1(null).field,
|
|
"new Class<int?>.constructor1(null).field");
|
|
// const Class<List<int>> is evaluated as const Class<List<int*>*> in weak
|
|
// mode:
|
|
expect(isWeakMode, e2.field,
|
|
"const Class<List<int>>.constructor1(<Null>[null]).field");
|
|
expect(new Class<Null>.constructor1(null).field, e3.field,
|
|
"Class<Null>.constructor1(null).field");
|
|
expect(new Class<int>.constructor2(null).field, e4.field,
|
|
"Class<int>.constructor2(null).field");
|
|
expect(true, new Class<int?>.constructor2(null).field,
|
|
"new Class<int?>.constructor2(null).field");
|
|
// const Class<int?> is evaluated as const Class<int?> in weak mode:
|
|
expect(new Class<int?>.constructor2(null).field, e5.field,
|
|
"Class<int?>.constructor2(null).field");
|
|
expect(new Class<Null>.constructor2(null).field, e6.field,
|
|
"Class<Null>.constructor2(null).field");
|
|
expect(new Class<int>.constructor3(null).field, e7.field,
|
|
"Class<int>.constructor3(null).field");
|
|
expect(new Class<int?>.constructor3(null).field, e8.field,
|
|
"Class<int?>.constructor3(null).field");
|
|
expect(new Class<int?>.constructor3(null).field, e8.field,
|
|
"Class<int?>.constructor3(null).field");
|
|
expect(new Class<Null>.constructor3(null).field, e9.field,
|
|
"Class<Null>.constructor3(null).field");
|
|
expect(new Class<int>.constructor4(null).field, e10.field,
|
|
"Class<int>.constructor4(null).field");
|
|
expect(new Class<int?>.constructor4(null).field, e11.field,
|
|
"Class<int?>.constructor4(null).field");
|
|
expect(new Class<Null>.constructor4(null).field, e12.field,
|
|
"Class<Null>.constructor4(null).field");
|
|
test();
|
|
}
|
|
|
|
expect(expected, actual, String message) {
|
|
if (expected != actual)
|
|
throw 'Expected $expected, actual $actual for $message';
|
|
}
|