[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>
This commit is contained in:
Chloe Stefantsova
2025-01-30 02:02:41 -08:00
committed by Commit Queue
parent bfc2fc065e
commit c32edddf80
19 changed files with 491 additions and 109 deletions
@@ -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(
@@ -4716,16 +4716,20 @@ class ConstantEvaluator implements ExpressionVisitor<Constant> {
@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
@@ -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);
}
+12 -12
View File
@@ -148,10 +148,10 @@ const Map<String, ({int hitCount, int missCount})> _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<String, ({int hitCount, int missCount})> _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<String, ({int hitCount, int missCount})> _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<String, ({int hitCount, int missCount})> _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<String, ({int hitCount, int missCount})> _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<String, ({int hitCount, int missCount})> _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<String, ({int hitCount, int missCount})> _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": (
@@ -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() {}
@@ -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)
@@ -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)
@@ -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
@@ -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)
@@ -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() {}
@@ -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() {}
@@ -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';
}
@@ -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)
@@ -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)
@@ -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
@@ -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)
@@ -15,6 +15,8 @@ const Class e = const Class(a);
const Class f = const Class(c);
test() {}
main() {}
expect(expected, actual) {}
@@ -18,3 +18,5 @@ const int b = a!;
expect(expected, actual) {}
main() {}
test() {}
@@ -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: