// 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"; // These are typed `Object?` to avoid warnings that the "??" are unnecessary // when the LHS is non-nullable. const Object? theNull = null; const Object? 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"); }