| 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");
|
| +}
|
|
|