| // 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'; |
| } |