6cc9efe290
Change-Id: I94dfcea40566190c6bf153c108b0d0d5dbf27a4d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/400148 Commit-Queue: Bob Nystrom <rnystrom@google.com> Reviewed-by: Lasse Nielsen <lrn@google.com> Auto-Submit: Bob Nystrom <rnystrom@google.com>
142 lines
4.4 KiB
Dart
142 lines
4.4 KiB
Dart
// 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");
|
|
}
|