| // Copyright (c) 2015, 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. |
| |
| // @dart = 2.9 |
| |
| // Check that ?? is compile-time constant. |
| |
| import "package:expect/expect.dart"; |
| |
| const theNull = null; |
| const notNull = const Object(); |
| |
| // Top-level const field initializer. |
| const test1 = theNull ?? notNull; |
| const test2 = notNull ?? theNull; |
| const test3 = theNull ?? theNull ?? notNull; |
| const test4 = theNull ?? theNull ?? theNull; |
| |
| class P { |
| final v; |
| const P(this.v); |
| } |
| |
| // Annotation parameter (not checked by test!) |
| @P(theNull ?? notNull) |
| @P(notNull ?? theNull) |
| @P(theNull ?? theNull ?? notNull) |
| @P(theNull ?? theNull ?? theNull) |
| class C { |
| // Static const field initializer. |
| static const test5 = theNull ?? notNull; |
| static const test6 = notNull ?? theNull; |
| static const test7 = theNull ?? theNull ?? notNull; |
| static const test8 = theNull ?? theNull ?? theNull; |
| |
| // (Constructor) parameter defaults. |
| final test9; |
| final test10; |
| final test11; |
| final test12; |
| |
| // Const constructor initializer list. |
| final test13; |
| final test14; |
| final test15; |
| final test16; |
| final test17; |
| |
| const C(x, |
| [this.test9 = theNull ?? notNull, |
| this.test10 = notNull ?? theNull, |
| this.test11 = theNull ?? theNull ?? notNull, |
| this.test12 = theNull ?? theNull ?? theNull]) |
| : test13 = theNull ?? x, |
| test14 = notNull ?? x, |
| test15 = x ?? notNull, |
| test16 = theNull ?? theNull ?? x, |
| test17 = theNull ?? x ?? notNull; |
| |
| List methodLocal() { |
| // Method local const variable initializer. |
| const test18 = theNull ?? notNull; |
| const test19 = notNull ?? theNull; |
| const test20 = theNull ?? theNull ?? notNull; |
| const test21 = theNull ?? theNull ?? theNull; |
| |
| return const [test18, test19, test20, test21]; |
| } |
| |
| List expressionLocal() { |
| // Constant expression sub-expression. |
| return const [ |
| theNull ?? notNull, |
| notNull ?? theNull, |
| theNull ?? theNull ?? notNull, |
| theNull ?? theNull ?? theNull |
| ]; |
| } |
| } |
| |
| main() { |
| Expect.identical(notNull, test1, "test1"); |
| Expect.identical(notNull, test2, "test2"); |
| Expect.identical(notNull, test3, "test3"); |
| Expect.identical(theNull, test4, "test4"); |
| |
| Expect.identical(notNull, C.test5, "test5"); |
| Expect.identical(notNull, C.test6, "test6"); |
| Expect.identical(notNull, C.test7, "test7"); |
| Expect.identical(theNull, C.test8, "test8"); |
| |
| const c1 = const C(null); |
| Expect.identical(notNull, c1.test9, "test9"); |
| Expect.identical(notNull, c1.test10, "test10"); |
| Expect.identical(notNull, c1.test11, "test11"); |
| Expect.identical(theNull, c1.test12, "test12"); |
| |
| Expect.identical(theNull, c1.test13, "test13"); |
| Expect.identical(notNull, c1.test14, "test14"); |
| Expect.identical(notNull, c1.test15, "test15"); |
| Expect.identical(theNull, c1.test16, "test16"); |
| Expect.identical(notNull, c1.test17, "test17"); |
| |
| var list = c1.methodLocal(); |
| Expect.identical(notNull, list[0], "test18"); |
| Expect.identical(notNull, list[1], "test19"); |
| Expect.identical(notNull, list[2], "test20"); |
| Expect.identical(theNull, list[3], "test21"); |
| |
| list = c1.expressionLocal(); |
| Expect.identical(notNull, list[0], "test22"); |
| Expect.identical(notNull, list[1], "test23"); |
| Expect.identical(notNull, list[2], "test24"); |
| Expect.identical(theNull, list[3], "test25"); |
| |
| const c2 = const C(42); |
| Expect.identical(notNull, c2.test9, "test26"); |
| Expect.identical(notNull, c2.test10, "test27"); |
| Expect.identical(notNull, c2.test11, "test28"); |
| Expect.identical(theNull, c2.test12, "test29"); |
| |
| Expect.identical(42, c2.test13, "test30"); |
| Expect.identical(notNull, c2.test14, "test31"); |
| Expect.identical(42, c2.test15, "test32"); |
| Expect.identical(42, c2.test16, "test33"); |
| Expect.identical(42, c2.test17, "test34"); |
| |
| list = c2.methodLocal(); |
| Expect.identical(notNull, list[0], "test35"); |
| Expect.identical(notNull, list[1], "test36"); |
| Expect.identical(notNull, list[2], "test37"); |
| Expect.identical(theNull, list[3], "test38"); |
| |
| list = c2.expressionLocal(); |
| Expect.identical(notNull, list[0], "test39"); |
| Expect.identical(notNull, list[1], "test40"); |
| Expect.identical(notNull, list[2], "test41"); |
| Expect.identical(theNull, list[3], "test42"); |
| } |