From c32edddf809c85aeb9fba4b517b13231e46f3e11 Mon Sep 17 00:00:00 2001 From: Chloe Stefantsova Date: Thu, 30 Jan 2025 02:02:41 -0800 Subject: [PATCH] [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 Reviewed-by: Johnni Winther Reviewed-by: Mayank Patke --- .../model/cfe_constant_evaluation_common.dart | 4 - .../lib/src/kernel/constant_evaluator.dart | 20 +++-- .../lib/src/kernel/expression_generator.dart | 1 - .../test/coverage_suite_expected.dart | 24 ++--- .../testcases/general/issue59800.dart | 29 +++++++ .../general/issue59800.dart.strong.expect | 87 +++++++++++++++++++ .../issue59800.dart.strong.modular.expect | 87 +++++++++++++++++++ .../issue59800.dart.strong.outline.expect | 49 +++++++++++ .../issue59800.dart.strong.transformed.expect | 87 +++++++++++++++++++ .../issue59800.dart.textual_outline.expect | 34 ++++++++ ...59800.dart.textual_outline_modelled.expect | 34 ++++++++ .../testcases/nnbd/constant_null_check.dart | 4 +- .../constant_null_check.dart.strong.expect | 41 ++++----- ...tant_null_check.dart.strong.modular.expect | 41 ++++----- ...tant_null_check.dart.strong.outline.expect | 8 +- ..._null_check.dart.strong.transformed.expect | 41 ++++----- ...ant_null_check.dart.textual_outline.expect | 2 + ...check.dart.textual_outline_modelled.expect | 2 + ...dimensional.dart.strong.transformed.expect | 5 -- 19 files changed, 491 insertions(+), 109 deletions(-) create mode 100644 pkg/front_end/testcases/general/issue59800.dart create mode 100644 pkg/front_end/testcases/general/issue59800.dart.strong.expect create mode 100644 pkg/front_end/testcases/general/issue59800.dart.strong.modular.expect create mode 100644 pkg/front_end/testcases/general/issue59800.dart.strong.outline.expect create mode 100644 pkg/front_end/testcases/general/issue59800.dart.strong.transformed.expect create mode 100644 pkg/front_end/testcases/general/issue59800.dart.textual_outline.expect create mode 100644 pkg/front_end/testcases/general/issue59800.dart.textual_outline_modelled.expect diff --git a/pkg/compiler/test/model/cfe_constant_evaluation_common.dart b/pkg/compiler/test/model/cfe_constant_evaluation_common.dart index adb12475f35..29df78a7807 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 @@ class B extends A { 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 @@ class B extends A { 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 fcef74df990..fd26d782a35 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 @@ class ConstantEvaluator implements ExpressionVisitor { @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 4e77f1b62d8..cf24a4c1f7d 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 @@ abstract class Generator { } 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 ca9577fc017..4f8f00bbcc2 100644 --- a/pkg/front_end/test/coverage_suite_expected.dart +++ b/pkg/front_end/test/coverage_suite_expected.dart @@ -148,10 +148,10 @@ const Map _expect = { 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 @@ const Map _expect = { 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 @@ const Map _expect = { 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 @@ const Map _expect = { ), // 100.0%. "package:front_end/src/kernel/constant_evaluator.dart": ( - hitCount: 3735, + hitCount: 3731, missCount: 0, ), // 100.0%. @@ -640,7 +640,7 @@ const Map _expect = { ), // 100.0%. "package:front_end/src/kernel/expression_generator.dart": ( - hitCount: 2522, + hitCount: 2527, missCount: 0, ), // 100.0%. @@ -944,10 +944,10 @@ const Map _expect = { 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 @@ const Map _expect = { 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 00000000000..3902784798a --- /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 00000000000..e176a19fd24 --- /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 [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 00000000000..e176a19fd24 --- /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 [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 00000000000..573ea1422e5 --- /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 00000000000..e176a19fd24 --- /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 [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 00000000000..58a6d6a2e50 --- /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 00000000000..96f735de293 --- /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 3ebe34fa490..f8c1621bab7 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 @@ class Class { 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 7966bdf0baa..cff9e1defa2 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 @@ library; // // 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 @@ class Class extends core::Object /*hasConstConstructor*/ { ; } 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 @@ static method expect(dynamic expected, dynamic actual) → dynamic { 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 7966bdf0baa..cff9e1defa2 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 @@ library; // // 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 @@ class Class extends core::Object /*hasConstConstructor*/ { ; } 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 @@ static method expect(dynamic expected, dynamic actual) → dynamic { 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 52b5f54102d..baa0ec5ca70 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? c = null; 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 @@ static method expect(dynamic expected, dynamic actual) → dynamic 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 7966bdf0baa..cff9e1defa2 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 @@ library; // // 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 @@ class Class extends core::Object /*hasConstConstructor*/ { ; } 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 @@ static method expect(dynamic expected, dynamic actual) → dynamic { 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 595b26b12cc..ae74f24f308 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 e = const Class(a); 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 0c3d45ac269..3435f9d11fa 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 @@ const int b = a!; 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 46629097753..933b4ab77c0 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 @@ constants { #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: