Index: tests/language/const_qq_test.dart |
diff --git a/tests/language/const_qq_test.dart b/tests/language/const_qq_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d1c16422b9fe69b5fd34cb9ef1a1e97b22548806 |
--- /dev/null |
+++ b/tests/language/const_qq_test.dart |
@@ -0,0 +1,136 @@ |
+// 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. |
+ |
+// 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"); |
+} |