[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:
committed by
Commit Queue
parent
bfc2fc065e
commit
c32edddf80
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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() {}
|
||||
|
||||
-5
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user