[cfe] Report "!" in constant expressions as error
Closes https://github.com/dart-lang/sdk/issues/59800
Change-Id: I06d68eb1d0608a0a865002c88f7665415159f468
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/405901
Commit-Queue: Chloe Stefantsova <cstefantsova@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Mayank Patke <fishythefish@google.com>
diff --git a/pkg/compiler/test/model/cfe_constant_evaluation_common.dart b/pkg/compiler/test/model/cfe_constant_evaluation_common.dart
index adb1247..29df78a 100644
--- a/pkg/compiler/test/model/cfe_constant_evaluation_common.dart
+++ b/pkg/compiler/test/model/cfe_constant_evaluation_common.dart
@@ -604,9 +604,6 @@
final b;
const D(c) : b = c + 2, super(c + 1);
}
- class E {
- const E() : assert(true_!);
- }
''',
[
ConstantData(r'const A()', 'ConstructedConstant(A())'),
@@ -615,7 +612,6 @@
r'const D(0)',
'ConstructedConstant(D(a=IntConstant(1),b=IntConstant(2)))',
),
- ConstantData(r'const E()', 'ConstructedConstant(E())'),
],
),
TestData(
diff --git a/pkg/front_end/lib/src/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/kernel/constant_evaluator.dart
index fcef74df..fd26d78 100644
--- a/pkg/front_end/lib/src/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/kernel/constant_evaluator.dart
@@ -4716,16 +4716,20 @@
@override
Constant visitNullCheck(NullCheck node) {
- final Constant constant = _evaluateSubexpression(node.operand);
- if (constant is AbortConstant) return constant;
- if (constant is NullConstant) {
- return createEvaluationErrorConstant(node, messageConstEvalNonNull);
- }
- if (shouldBeUnevaluated) {
+ if (enableConstFunctions) {
// Coverage-ignore-block(suite): Not run.
- return unevaluated(node, new NullCheck(_wrap(constant)));
+ final Constant constant = _evaluateSubexpression(node.operand);
+ if (constant is AbortConstant) return constant;
+ if (constant is NullConstant) {
+ return createEvaluationErrorConstant(node, messageConstEvalNonNull);
+ }
+ if (shouldBeUnevaluated) {
+ return unevaluated(node, new NullCheck(_wrap(constant)));
+ }
+ return constant;
+ } else {
+ return _notAConstantExpression(node);
}
- return constant;
}
@override
diff --git a/pkg/front_end/lib/src/kernel/expression_generator.dart b/pkg/front_end/lib/src/kernel/expression_generator.dart
index 4e77f1b..cf24a4c 100644
--- a/pkg/front_end/lib/src/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/kernel/expression_generator.dart
@@ -205,7 +205,6 @@
} else {
if (_helper.constantContext != ConstantContext.none &&
selector.name != lengthName) {
- // Coverage-ignore-block(suite): Not run.
_helper.addProblem(
messageNotAConstantExpression, fileOffset, token.length);
}
diff --git a/pkg/front_end/test/coverage_suite_expected.dart b/pkg/front_end/test/coverage_suite_expected.dart
index ca9577f..4f8f00b 100644
--- a/pkg/front_end/test/coverage_suite_expected.dart
+++ b/pkg/front_end/test/coverage_suite_expected.dart
@@ -148,10 +148,10 @@
hitCount: 97,
missCount: 0,
),
- // 99.88331388564761%.
+ // 100.0%.
"package:front_end/src/base/incremental_compiler.dart": (
hitCount: 856,
- missCount: 1,
+ missCount: 0,
),
// 100.0%.
"package:front_end/src/base/incremental_serializer.dart": (
@@ -183,10 +183,10 @@
hitCount: 31,
missCount: 0,
),
- // 99.26470588235294%.
+ // 100.0%.
"package:front_end/src/base/modifiers.dart": (
hitCount: 135,
- missCount: 1,
+ missCount: 0,
),
// 100.0%.
"package:front_end/src/base/name_space.dart": (
@@ -208,10 +208,10 @@
hitCount: 260,
missCount: 0,
),
- // 99.38837920489296%.
+ // 100.0%.
"package:front_end/src/base/scope.dart": (
hitCount: 650,
- missCount: 4,
+ missCount: 0,
),
// 100.0%.
"package:front_end/src/base/ticker.dart": (
@@ -615,7 +615,7 @@
),
// 100.0%.
"package:front_end/src/kernel/constant_evaluator.dart": (
- hitCount: 3735,
+ hitCount: 3731,
missCount: 0,
),
// 100.0%.
@@ -640,7 +640,7 @@
),
// 100.0%.
"package:front_end/src/kernel/expression_generator.dart": (
- hitCount: 2522,
+ hitCount: 2527,
missCount: 0,
),
// 100.0%.
@@ -944,10 +944,10 @@
hitCount: 1003,
missCount: 0,
),
- // 97.91666666666666%.
+ // 100.0%.
"package:front_end/src/source/source_function_builder.dart": (
hitCount: 47,
- missCount: 1,
+ missCount: 0,
),
// 100.0%.
"package:front_end/src/source/source_library_builder.dart": (
@@ -1109,10 +1109,10 @@
hitCount: 20,
missCount: 0,
),
- // 92.0%.
+ // 100.0%.
"package:front_end/src/util/local_stack.dart": (
hitCount: 23,
- missCount: 2,
+ missCount: 0,
),
// 100.0%.
"package:front_end/src/util/parser_ast.dart": (
diff --git a/pkg/front_end/testcases/general/issue59800.dart b/pkg/front_end/testcases/general/issue59800.dart
new file mode 100644
index 0000000..3902784
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue59800.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2025, 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.
+
+class A {
+ final int? foo;
+ const A(this.foo);
+}
+
+const int? CNull = null;
+const int? CInt = 0;
+const A CANull = const A(null);
+const A CAInt = const A(0);
+
+const int C1 = 0!; // Error.
+const int C2 = null!; // Error.
+const int C3 = CInt!; // Error.
+const int C4 = CNull!; // Error.
+const int C5 = CAInt.foo!; // Error.
+const int C6 = CANull.foo!; // Error.
+const int C7 = "".length!; // Error.
+const int C8 = ""!.length; // Error.
+const int C9 = ""!.length!; // Error.
+
+test() {
+ return [C1, C2, C3, C4, C5, C6, C7, C8, C9];
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/issue59800.dart.strong.expect b/pkg/front_end/testcases/general/issue59800.dart.strong.expect
new file mode 100644
index 0000000..e176a19
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue59800.dart.strong.expect
@@ -0,0 +1,87 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue59800.dart:19:16: Error: Not a constant expression.
+// const int C5 = CAInt.foo!; // Error.
+// ^^^^^
+//
+// pkg/front_end/testcases/general/issue59800.dart:20:16: Error: Not a constant expression.
+// const int C6 = CANull.foo!; // Error.
+// ^^^^^^
+//
+// pkg/front_end/testcases/general/issue59800.dart:15:17: Error: Not a constant expression.
+// const int C1 = 0!; // Error.
+// ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:16:20: Error: Not a constant expression.
+// const int C2 = null!; // Error.
+// ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:17:20: Error: Not a constant expression.
+// const int C3 = CInt!; // Error.
+// ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:18:21: Error: Not a constant expression.
+// const int C4 = CNull!; // Error.
+// ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:19:25: Error: Not a constant expression.
+// const int C5 = CAInt.foo!; // Error.
+// ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:20:26: Error: Not a constant expression.
+// const int C6 = CANull.foo!; // Error.
+// ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:21:25: Error: Not a constant expression.
+// const int C7 = "".length!; // Error.
+// ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:22:18: Error: Not a constant expression.
+// const int C8 = ""!.length; // Error.
+// ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:23:26: Error: Not a constant expression.
+// const int C9 = ""!.length!; // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/ {
+ final field core::int? foo;
+ const constructor •(core::int? foo) → self::A
+ : self::A::foo = foo, super core::Object::•()
+ ;
+}
+static const field core::int? CNull = #C1;
+static const field core::int? CInt = #C2;
+static const field self::A CANull = #C3;
+static const field self::A CAInt = #C4;
+static const field core::int C1 = invalid-expression "Not a constant expression.";
+static const field core::int C2 = invalid-expression "Not a constant expression.";
+static const field core::int C3 = invalid-expression "Not a constant expression.";
+static const field core::int C4 = invalid-expression "Not a constant expression.";
+static const field core::int C5 = invalid-expression "Not a constant expression.";
+static const field core::int C6 = invalid-expression "Not a constant expression.";
+static const field core::int C7 = invalid-expression "Not a constant expression.";
+static const field core::int C8 = invalid-expression "Not a constant expression.";
+static const field core::int C9 = invalid-expression "Not a constant expression.";
+static method test() → dynamic {
+ return <core::int>[invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression."];
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = null
+ #C2 = 0
+ #C3 = self::A {foo:#C1}
+ #C4 = self::A {foo:#C2}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue59800.dart:
+- A. (from org-dartlang-testcase:///issue59800.dart:7:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
diff --git a/pkg/front_end/testcases/general/issue59800.dart.strong.modular.expect b/pkg/front_end/testcases/general/issue59800.dart.strong.modular.expect
new file mode 100644
index 0000000..e176a19
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue59800.dart.strong.modular.expect
@@ -0,0 +1,87 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue59800.dart:19:16: Error: Not a constant expression.
+// const int C5 = CAInt.foo!; // Error.
+// ^^^^^
+//
+// pkg/front_end/testcases/general/issue59800.dart:20:16: Error: Not a constant expression.
+// const int C6 = CANull.foo!; // Error.
+// ^^^^^^
+//
+// pkg/front_end/testcases/general/issue59800.dart:15:17: Error: Not a constant expression.
+// const int C1 = 0!; // Error.
+// ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:16:20: Error: Not a constant expression.
+// const int C2 = null!; // Error.
+// ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:17:20: Error: Not a constant expression.
+// const int C3 = CInt!; // Error.
+// ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:18:21: Error: Not a constant expression.
+// const int C4 = CNull!; // Error.
+// ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:19:25: Error: Not a constant expression.
+// const int C5 = CAInt.foo!; // Error.
+// ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:20:26: Error: Not a constant expression.
+// const int C6 = CANull.foo!; // Error.
+// ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:21:25: Error: Not a constant expression.
+// const int C7 = "".length!; // Error.
+// ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:22:18: Error: Not a constant expression.
+// const int C8 = ""!.length; // Error.
+// ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:23:26: Error: Not a constant expression.
+// const int C9 = ""!.length!; // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/ {
+ final field core::int? foo;
+ const constructor •(core::int? foo) → self::A
+ : self::A::foo = foo, super core::Object::•()
+ ;
+}
+static const field core::int? CNull = #C1;
+static const field core::int? CInt = #C2;
+static const field self::A CANull = #C3;
+static const field self::A CAInt = #C4;
+static const field core::int C1 = invalid-expression "Not a constant expression.";
+static const field core::int C2 = invalid-expression "Not a constant expression.";
+static const field core::int C3 = invalid-expression "Not a constant expression.";
+static const field core::int C4 = invalid-expression "Not a constant expression.";
+static const field core::int C5 = invalid-expression "Not a constant expression.";
+static const field core::int C6 = invalid-expression "Not a constant expression.";
+static const field core::int C7 = invalid-expression "Not a constant expression.";
+static const field core::int C8 = invalid-expression "Not a constant expression.";
+static const field core::int C9 = invalid-expression "Not a constant expression.";
+static method test() → dynamic {
+ return <core::int>[invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression."];
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = null
+ #C2 = 0
+ #C3 = self::A {foo:#C1}
+ #C4 = self::A {foo:#C2}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue59800.dart:
+- A. (from org-dartlang-testcase:///issue59800.dart:7:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
diff --git a/pkg/front_end/testcases/general/issue59800.dart.strong.outline.expect b/pkg/front_end/testcases/general/issue59800.dart.strong.outline.expect
new file mode 100644
index 0000000..573ea14
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue59800.dart.strong.outline.expect
@@ -0,0 +1,49 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue59800.dart:19:16: Error: Not a constant expression.
+// const int C5 = CAInt.foo!; // Error.
+// ^^^^^
+//
+// pkg/front_end/testcases/general/issue59800.dart:20:16: Error: Not a constant expression.
+// const int C6 = CANull.foo!; // Error.
+// ^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/ {
+ final field core::int? foo;
+ const constructor •(core::int? foo) → self::A
+ : self::A::foo = foo, super core::Object::•()
+ ;
+}
+static const field core::int? CNull = null;
+static const field core::int? CInt = 0;
+static const field self::A CANull = const self::A::•(null);
+static const field self::A CAInt = const self::A::•(0);
+static const field core::int C1 = 0!;
+static const field core::int C2 = null!;
+static const field core::int C3 = self::CInt!;
+static const field core::int C4 = self::CNull!;
+static const field core::int C5 = self::CAInt.{self::A::foo}{core::int?}!;
+static const field core::int C6 = self::CANull.{self::A::foo}{core::int?}!;
+static const field core::int C7 = "".{core::String::length}{core::int}!;
+static const field core::int C8 = ""!.{core::String::length}{core::int};
+static const field core::int C9 = ""!.{core::String::length}{core::int}!;
+static method test() → dynamic
+ ;
+static method main() → dynamic
+ ;
+
+
+Extra constant evaluation status:
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue59800.dart:12:24 -> InstanceConstant(const A{A.foo: null})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue59800.dart:13:23 -> InstanceConstant(const A{A.foo: 0})
+Evaluated: StaticGet @ org-dartlang-testcase:///issue59800.dart:17:16 -> IntConstant(0)
+Evaluated: StaticGet @ org-dartlang-testcase:///issue59800.dart:18:16 -> NullConstant(null)
+Evaluated: StaticGet @ org-dartlang-testcase:///issue59800.dart:19:16 -> InstanceConstant(const A{A.foo: 0})
+Evaluated: StaticGet @ org-dartlang-testcase:///issue59800.dart:20:16 -> InstanceConstant(const A{A.foo: null})
+Evaluated: InstanceGet @ org-dartlang-testcase:///issue59800.dart:21:19 -> IntConstant(0)
+Extra constant evaluation: evaluated: 22, effectively constant: 7
diff --git a/pkg/front_end/testcases/general/issue59800.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue59800.dart.strong.transformed.expect
new file mode 100644
index 0000000..e176a19
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue59800.dart.strong.transformed.expect
@@ -0,0 +1,87 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue59800.dart:19:16: Error: Not a constant expression.
+// const int C5 = CAInt.foo!; // Error.
+// ^^^^^
+//
+// pkg/front_end/testcases/general/issue59800.dart:20:16: Error: Not a constant expression.
+// const int C6 = CANull.foo!; // Error.
+// ^^^^^^
+//
+// pkg/front_end/testcases/general/issue59800.dart:15:17: Error: Not a constant expression.
+// const int C1 = 0!; // Error.
+// ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:16:20: Error: Not a constant expression.
+// const int C2 = null!; // Error.
+// ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:17:20: Error: Not a constant expression.
+// const int C3 = CInt!; // Error.
+// ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:18:21: Error: Not a constant expression.
+// const int C4 = CNull!; // Error.
+// ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:19:25: Error: Not a constant expression.
+// const int C5 = CAInt.foo!; // Error.
+// ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:20:26: Error: Not a constant expression.
+// const int C6 = CANull.foo!; // Error.
+// ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:21:25: Error: Not a constant expression.
+// const int C7 = "".length!; // Error.
+// ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:22:18: Error: Not a constant expression.
+// const int C8 = ""!.length; // Error.
+// ^
+//
+// pkg/front_end/testcases/general/issue59800.dart:23:26: Error: Not a constant expression.
+// const int C9 = ""!.length!; // Error.
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object /*hasConstConstructor*/ {
+ final field core::int? foo;
+ const constructor •(core::int? foo) → self::A
+ : self::A::foo = foo, super core::Object::•()
+ ;
+}
+static const field core::int? CNull = #C1;
+static const field core::int? CInt = #C2;
+static const field self::A CANull = #C3;
+static const field self::A CAInt = #C4;
+static const field core::int C1 = invalid-expression "Not a constant expression.";
+static const field core::int C2 = invalid-expression "Not a constant expression.";
+static const field core::int C3 = invalid-expression "Not a constant expression.";
+static const field core::int C4 = invalid-expression "Not a constant expression.";
+static const field core::int C5 = invalid-expression "Not a constant expression.";
+static const field core::int C6 = invalid-expression "Not a constant expression.";
+static const field core::int C7 = invalid-expression "Not a constant expression.";
+static const field core::int C8 = invalid-expression "Not a constant expression.";
+static const field core::int C9 = invalid-expression "Not a constant expression.";
+static method test() → dynamic {
+ return <core::int>[invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression.", invalid-expression "Not a constant expression."];
+}
+static method main() → dynamic {}
+
+constants {
+ #C1 = null
+ #C2 = 0
+ #C3 = self::A {foo:#C1}
+ #C4 = self::A {foo:#C2}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue59800.dart:
+- A. (from org-dartlang-testcase:///issue59800.dart:7:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
diff --git a/pkg/front_end/testcases/general/issue59800.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue59800.dart.textual_outline.expect
new file mode 100644
index 0000000..58a6d6a
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue59800.dart.textual_outline.expect
@@ -0,0 +1,34 @@
+class A {
+ final int? foo;
+ const A(this.foo);
+}
+
+const int? CNull = null;
+
+const int? CInt = 0;
+
+const A CANull = const A(null);
+
+const A CAInt = const A(0);
+
+const int C1 = 0!;
+
+const int C2 = null!;
+
+const int C3 = CInt!;
+
+const int C4 = CNull!;
+
+const int C5 = CAInt.foo!;
+
+const int C6 = CANull.foo!;
+
+const int C7 = "".length!;
+
+const int C8 = ""!.length;
+
+const int C9 = ""!.length!;
+
+test() {}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/issue59800.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue59800.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..96f735d
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue59800.dart.textual_outline_modelled.expect
@@ -0,0 +1,34 @@
+class A {
+ const A(this.foo);
+ final int? foo;
+}
+
+const A CAInt = const A(0);
+
+const A CANull = const A(null);
+
+const int? CInt = 0;
+
+const int? CNull = null;
+
+const int C1 = 0!;
+
+const int C2 = null!;
+
+const int C3 = CInt!;
+
+const int C4 = CNull!;
+
+const int C5 = CAInt.foo!;
+
+const int C6 = CANull.foo!;
+
+const int C7 = "".length!;
+
+const int C8 = ""!.length;
+
+const int C9 = ""!.length!;
+
+main() {}
+
+test() {}
diff --git a/pkg/front_end/testcases/nnbd/constant_null_check.dart b/pkg/front_end/testcases/nnbd/constant_null_check.dart
index 3ebe34f..f8c1621 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_check.dart
+++ b/pkg/front_end/testcases/nnbd/constant_null_check.dart
@@ -16,12 +16,14 @@
const Class e = const Class(a);
const Class f = const Class(c);
-main() {
+test() {
expect(42, a);
expect(42, b);
expect(42, e.y);
}
+main() {}
+
expect(expected, actual) {
if (expected != actual) throw 'Expected $expected, actual $actual';
}
diff --git a/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.expect b/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.expect
index 7966bdf..cff9e1d 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.expect
@@ -2,25 +2,17 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:9:17: Error: Constant evaluation error:
-// const int? d = c!;
-// ^
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:9:17: Context: Constant expression must be non-null.
-// const int? d = c!;
-// ^
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:9:12: Context: While analyzing:
-// const int? d = c!;
-// ^
+// pkg/front_end/testcases/nnbd/constant_null_check.dart:6:16: Error: Not a constant expression.
+// const int b = a!;
+// ^
//
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:17:23: Error: Constant evaluation error:
-// const Class f = const Class(c);
-// ^
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:13:30: Context: Constant expression must be non-null.
+// pkg/front_end/testcases/nnbd/constant_null_check.dart:13:30: Error: Not a constant expression.
// const Class(int? x) : y = x!;
// ^
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:17:13: Context: While analyzing:
-// const Class f = const Class(c);
-// ^
+//
+// pkg/front_end/testcases/nnbd/constant_null_check.dart:9:17: Error: Not a constant expression.
+// const int? d = c!;
+// ^
//
import self as self;
import "dart:core" as core;
@@ -32,16 +24,17 @@
;
}
static const field core::int? a = #C1;
-static const field core::int b = #C1;
+static const field core::int b = invalid-expression "Not a constant expression.";
static const field core::int? c = #C2;
-static const field core::int? d = invalid-expression "Constant expression must be non-null.";
-static const field self::Class e = #C3;
-static const field self::Class f = invalid-expression "Constant expression must be non-null.";
-static method main() → dynamic {
+static const field core::int? d = invalid-expression "Not a constant expression.";
+static const field self::Class e = invalid-expression "Not a constant expression.";
+static const field self::Class f = invalid-expression "Not a constant expression.";
+static method test() → dynamic {
self::expect(42, #C1);
- self::expect(42, #C1);
- self::expect(42, #C3.{self::Class::y}{core::int});
+ self::expect(42, invalid-expression "Not a constant expression.");
+ self::expect(42, invalid-expression "Not a constant expression.".{self::Class::y}{core::int});
}
+static method main() → dynamic {}
static method expect(dynamic expected, dynamic actual) → dynamic {
if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
throw "Expected ${expected}, actual ${actual}";
@@ -50,11 +43,9 @@
constants {
#C1 = 42
#C2 = null
- #C3 = self::Class {y:#C1}
}
Constructor coverage from constants:
org-dartlang-testcase:///constant_null_check.dart:
- Class. (from org-dartlang-testcase:///constant_null_check.dart:13:9)
-- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
diff --git a/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.modular.expect b/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.modular.expect
index 7966bdf..cff9e1d 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.modular.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.modular.expect
@@ -2,25 +2,17 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:9:17: Error: Constant evaluation error:
-// const int? d = c!;
-// ^
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:9:17: Context: Constant expression must be non-null.
-// const int? d = c!;
-// ^
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:9:12: Context: While analyzing:
-// const int? d = c!;
-// ^
+// pkg/front_end/testcases/nnbd/constant_null_check.dart:6:16: Error: Not a constant expression.
+// const int b = a!;
+// ^
//
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:17:23: Error: Constant evaluation error:
-// const Class f = const Class(c);
-// ^
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:13:30: Context: Constant expression must be non-null.
+// pkg/front_end/testcases/nnbd/constant_null_check.dart:13:30: Error: Not a constant expression.
// const Class(int? x) : y = x!;
// ^
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:17:13: Context: While analyzing:
-// const Class f = const Class(c);
-// ^
+//
+// pkg/front_end/testcases/nnbd/constant_null_check.dart:9:17: Error: Not a constant expression.
+// const int? d = c!;
+// ^
//
import self as self;
import "dart:core" as core;
@@ -32,16 +24,17 @@
;
}
static const field core::int? a = #C1;
-static const field core::int b = #C1;
+static const field core::int b = invalid-expression "Not a constant expression.";
static const field core::int? c = #C2;
-static const field core::int? d = invalid-expression "Constant expression must be non-null.";
-static const field self::Class e = #C3;
-static const field self::Class f = invalid-expression "Constant expression must be non-null.";
-static method main() → dynamic {
+static const field core::int? d = invalid-expression "Not a constant expression.";
+static const field self::Class e = invalid-expression "Not a constant expression.";
+static const field self::Class f = invalid-expression "Not a constant expression.";
+static method test() → dynamic {
self::expect(42, #C1);
- self::expect(42, #C1);
- self::expect(42, #C3.{self::Class::y}{core::int});
+ self::expect(42, invalid-expression "Not a constant expression.");
+ self::expect(42, invalid-expression "Not a constant expression.".{self::Class::y}{core::int});
}
+static method main() → dynamic {}
static method expect(dynamic expected, dynamic actual) → dynamic {
if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
throw "Expected ${expected}, actual ${actual}";
@@ -50,11 +43,9 @@
constants {
#C1 = 42
#C2 = null
- #C3 = self::Class {y:#C1}
}
Constructor coverage from constants:
org-dartlang-testcase:///constant_null_check.dart:
- Class. (from org-dartlang-testcase:///constant_null_check.dart:13:9)
-- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
diff --git a/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.outline.expect b/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.outline.expect
index 52b5f54..baa0ec5 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.outline.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.outline.expect
@@ -14,6 +14,8 @@
static const field core::int? d = self::c!;
static const field self::Class e = const self::Class::•(self::a);
static const field self::Class f = const self::Class::•(self::c);
+static method test() → dynamic
+ ;
static method main() → dynamic
;
static method expect(dynamic expected, dynamic actual) → dynamic
@@ -21,8 +23,8 @@
Extra constant evaluation status:
-Evaluated: NullCheck @ org-dartlang-testcase:///constant_null_check.dart:6:16 -> IntConstant(42)
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_null_check.dart:6:15 -> IntConstant(42)
Evaluated: StaticGet @ org-dartlang-testcase:///constant_null_check.dart:9:16 -> NullConstant(null)
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_check.dart:16:23 -> InstanceConstant(const Class{Class.y: 42})
+Evaluated: StaticGet @ org-dartlang-testcase:///constant_null_check.dart:16:29 -> IntConstant(42)
Evaluated: StaticGet @ org-dartlang-testcase:///constant_null_check.dart:17:29 -> NullConstant(null)
-Extra constant evaluation: evaluated: 8, effectively constant: 4
+Extra constant evaluation: evaluated: 10, effectively constant: 4
diff --git a/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.transformed.expect
index 7966bdf..cff9e1d 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_check.dart.strong.transformed.expect
@@ -2,25 +2,17 @@
//
// Problems in library:
//
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:9:17: Error: Constant evaluation error:
-// const int? d = c!;
-// ^
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:9:17: Context: Constant expression must be non-null.
-// const int? d = c!;
-// ^
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:9:12: Context: While analyzing:
-// const int? d = c!;
-// ^
+// pkg/front_end/testcases/nnbd/constant_null_check.dart:6:16: Error: Not a constant expression.
+// const int b = a!;
+// ^
//
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:17:23: Error: Constant evaluation error:
-// const Class f = const Class(c);
-// ^
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:13:30: Context: Constant expression must be non-null.
+// pkg/front_end/testcases/nnbd/constant_null_check.dart:13:30: Error: Not a constant expression.
// const Class(int? x) : y = x!;
// ^
-// pkg/front_end/testcases/nnbd/constant_null_check.dart:17:13: Context: While analyzing:
-// const Class f = const Class(c);
-// ^
+//
+// pkg/front_end/testcases/nnbd/constant_null_check.dart:9:17: Error: Not a constant expression.
+// const int? d = c!;
+// ^
//
import self as self;
import "dart:core" as core;
@@ -32,16 +24,17 @@
;
}
static const field core::int? a = #C1;
-static const field core::int b = #C1;
+static const field core::int b = invalid-expression "Not a constant expression.";
static const field core::int? c = #C2;
-static const field core::int? d = invalid-expression "Constant expression must be non-null.";
-static const field self::Class e = #C3;
-static const field self::Class f = invalid-expression "Constant expression must be non-null.";
-static method main() → dynamic {
+static const field core::int? d = invalid-expression "Not a constant expression.";
+static const field self::Class e = invalid-expression "Not a constant expression.";
+static const field self::Class f = invalid-expression "Not a constant expression.";
+static method test() → dynamic {
self::expect(42, #C1);
- self::expect(42, #C1);
- self::expect(42, #C3.{self::Class::y}{core::int});
+ self::expect(42, invalid-expression "Not a constant expression.");
+ self::expect(42, invalid-expression "Not a constant expression.".{self::Class::y}{core::int});
}
+static method main() → dynamic {}
static method expect(dynamic expected, dynamic actual) → dynamic {
if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
throw "Expected ${expected}, actual ${actual}";
@@ -50,11 +43,9 @@
constants {
#C1 = 42
#C2 = null
- #C3 = self::Class {y:#C1}
}
Constructor coverage from constants:
org-dartlang-testcase:///constant_null_check.dart:
- Class. (from org-dartlang-testcase:///constant_null_check.dart:13:9)
-- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
diff --git a/pkg/front_end/testcases/nnbd/constant_null_check.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/constant_null_check.dart.textual_outline.expect
index 595b26b..ae74f24 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_check.dart.textual_outline.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_check.dart.textual_outline.expect
@@ -15,6 +15,8 @@
const Class f = const Class(c);
+test() {}
+
main() {}
expect(expected, actual) {}
diff --git a/pkg/front_end/testcases/nnbd/constant_null_check.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/constant_null_check.dart.textual_outline_modelled.expect
index 0c3d45a..3435f9d 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_check.dart.textual_outline_modelled.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_check.dart.textual_outline_modelled.expect
@@ -18,3 +18,5 @@
expect(expected, actual) {}
main() {}
+
+test() {}
diff --git a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.transformed.expect
index 4662909..933b4ab 100644
--- a/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart.strong.transformed.expect
@@ -81,11 +81,6 @@
#C19 = 1
}
-Extra constant evaluation status:
-Evaluated: NullCheck @ org-dartlang-testcase:///ffi_struct_inline_array_multi_dimensional.dart:18:25 -> IntConstant(0)
-Evaluated: NullCheck @ org-dartlang-testcase:///ffi_struct_inline_array_multi_dimensional.dart:19:8 -> IntConstant(1)
-Extra constant evaluation: evaluated: 93, effectively constant: 2
-
Constructor coverage from constants:
org-dartlang-testcase:///ffi_struct_inline_array_multi_dimensional.dart: