[CFE] Allow 'as' and 'is' expressions as constants.
Also clean out obsolete status file entries due to renamed constant
update test directory.
Change-Id: I135d8c9cac19342143bf8154d1b2e72cf0b8dd01
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/93161
Reviewed-by: Kevin Millikin <kmillikin@google.com>
Commit-Queue: Aske Simon Christensen <askesc@google.com>
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index ccacb1f..da0c696 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -2740,7 +2740,8 @@
DartType type = buildDartType(pop());
library.checkBoundsInType(type, typeEnvironment, operator.charOffset);
Expression expression = popForValue();
- if (constantContext != ConstantContext.none) {
+ if (!library.loader.target.enableConstantUpdate2018 &&
+ constantContext != ConstantContext.none) {
push(desugarSyntheticExpression(buildProblem(
fasta.templateNotConstantExpression.withArguments('As expression'),
operator.charOffset,
@@ -2764,7 +2765,8 @@
typePromoter?.handleIsCheck(isExpression, isInverted, operand.variable,
type, functionNestingLevel);
}
- if (constantContext != ConstantContext.none) {
+ if (!library.loader.target.enableConstantUpdate2018 &&
+ constantContext != ConstantContext.none) {
push(desugarSyntheticExpression(buildProblem(
fasta.templateNotConstantExpression.withArguments('Is expression'),
isOperator.charOffset,
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index 406d18d..390464f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -1468,8 +1468,24 @@
if (hasUnevaluatedChild(node)) {
return unevaluated(node, new AsExpression(extract(constant), node.type));
}
- ensureIsSubtype(constant, evaluateDartType(node, node.type), node);
- return constant;
+ return ensureIsSubtype(constant, evaluateDartType(node, node.type), node);
+ }
+
+ visitIsExpression(IsExpression node) {
+ final Constant constant = node.operand.accept(this);
+ if (hasUnevaluatedChild(node)) {
+ return unevaluated(node, new IsExpression(extract(constant), node.type));
+ }
+ if (constant is NullConstant) {
+ return node.type == typeEnvironment.nullType ||
+ node.type == typeEnvironment.objectType ||
+ node.type is DynamicType
+ ? trueConstant
+ : falseConstant;
+ }
+ return isSubtype(constant, evaluateDartType(node, node.type))
+ ? trueConstant
+ : falseConstant;
}
visitNot(Not node) {
@@ -1535,15 +1551,19 @@
return new DoubleConstant(value);
}
- void ensureIsSubtype(Constant constant, DartType type, TreeNode node) {
+ bool isSubtype(Constant constant, DartType type) {
DartType constantType = constant.getType(typeEnvironment);
+ return typeEnvironment.isSubtypeOf(constantType, type);
+ }
- if (!typeEnvironment.isSubtypeOf(constantType, type)) {
+ Constant ensureIsSubtype(Constant constant, DartType type, TreeNode node) {
+ if (!isSubtype(constant, type)) {
return report(
node,
templateConstEvalInvalidType.withArguments(
constant, type, constant.getType(typeEnvironment)));
}
+ return constant;
}
List<DartType> evaluateTypeArguments(TreeNode node, Arguments arguments) {
diff --git a/tests/co19_2/co19_2-kernel.status b/tests/co19_2/co19_2-kernel.status
index ae5dee4..c2fc2a6 100644
--- a/tests/co19_2/co19_2-kernel.status
+++ b/tests/co19_2/co19_2-kernel.status
@@ -41,17 +41,6 @@
Language/Statements/Yield_and_Yield_Each/Yield_Each/execution_async_t09: RuntimeError
Language/Types/Interface_Types/subtype_t03: RuntimeError
Language/Types/Interface_Types/subtype_t26: RuntimeError
-LanguageFeatures/Constant_update2018/CastOperator_A03_t01/none: RuntimeError
-LanguageFeatures/Constant_update2018/CastOperator_A03_t03/none: RuntimeError
-LanguageFeatures/Constant_update2018/EqualityOperator_A01_t01: RuntimeError
-LanguageFeatures/Constant_update2018/EqualityOperator_A01_t02: RuntimeError
-LanguageFeatures/Constant_update2018/NewOperators_A02_t03/none: RuntimeError
-LanguageFeatures/Constant_update2018/NewOperators_A02_t06/none: RuntimeError
-LanguageFeatures/Constant_update2018/NewOperators_A02_t09/none: RuntimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t02: RuntimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t04: RuntimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t05/none: RuntimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t06/none: RuntimeError
LanguageFeatures/Control-flow-collections/*: Skip
LanguageFeatures/Set-literals/syntax_compatibility_A01_t02: RuntimeError
LanguageFeatures/Spread-collections/ConstSpreads_A01_t01: DartkCrash
@@ -123,7 +112,6 @@
[ $compiler == fasta ]
Language/Statements/For/syntax_t13: Crash # Assertion error: kernel_shadow_ast.dart: 'receiver == null': is not true.
Language/Statements/For/syntax_t20: Crash # Assertion error: kernel_shadow_ast.dart: 'receiver == null': is not true.
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t03: Crash
LanguageFeatures/Control-flow-collections/const_collections_A02_t03: CompileTimeError
LanguageFeatures/Control-flow-collections/const_collections_A02_t04: CompileTimeError
LanguageFeatures/Control-flow-collections/const_collections_A03_t02/01: MissingCompileTimeError
@@ -362,10 +350,6 @@
Language/Types/Type_Aliases/syntax_t04: CompileTimeError
Language/Types/Type_Aliases/syntax_t20: CompileTimeError
Language/Types/Type_Aliases/syntax_t21: CompileTimeError
-LanguageFeatures/Constant-update-2018/CastOperator_A01_t01: CompileTimeError
-LanguageFeatures/Constant-update-2018/CastOperator_A02_t01: CompileTimeError
-LanguageFeatures/Constant-update-2018/CastOperator_A02_t02: CompileTimeError
-LanguageFeatures/Constant-update-2018/CastOperator_A04_t02/none: CompileTimeError
LanguageFeatures/Constant-update-2018/EqualityOperator_A01_t09: MissingCompileTimeError
LanguageFeatures/Constant-update-2018/EqualityOperator_A01_t10: MissingCompileTimeError
LanguageFeatures/Constant-update-2018/NewOperators_A01_t01: CompileTimeError
@@ -376,75 +360,8 @@
LanguageFeatures/Constant-update-2018/NewOperators_A02_t06: CompileTimeError
LanguageFeatures/Constant-update-2018/NewOperators_A02_t09: CompileTimeError
LanguageFeatures/Constant-update-2018/NewOperators_A02_t10: CompileTimeError
-LanguageFeatures/Constant-update-2018/ShortCircuitOperators_A01_t01: CompileTimeError
-LanguageFeatures/Constant-update-2018/ShortCircuitOperators_A01_t07: CompileTimeError
-LanguageFeatures/Constant-update-2018/ShortCircuitOperators_A02_t01: CompileTimeError
-LanguageFeatures/Constant-update-2018/ShortCircuitOperators_A02_t08: CompileTimeError
LanguageFeatures/Constant-update-2018/ShortCircuitOperators_A03_t01: Crash
LanguageFeatures/Constant-update-2018/ShortCircuitOperators_A03_t02: Crash
-LanguageFeatures/Constant-update-2018/ShortCircuitOperators_A03_t05: CompileTimeError
-LanguageFeatures/Constant-update-2018/ShortCircuitOperators_A03_t06: CompileTimeError
-LanguageFeatures/Constant-update-2018/ShortCircuitOperators_A04_t01: CompileTimeError
-LanguageFeatures/Constant-update-2018/ShortCircuitOperators_A04_t02: CompileTimeError
-LanguageFeatures/Constant-update-2018/ShortCircuitOperators_A04_t03: CompileTimeError
-LanguageFeatures/Constant-update-2018/ShortCircuitOperators_A04_t05: CompileTimeError
-LanguageFeatures/Constant-update-2018/ShortCircuitOperators_A04_t06: CompileTimeError
-LanguageFeatures/Constant-update-2018/ShortCircuitOperators_A04_t07: CompileTimeError
-LanguageFeatures/Constant-update-2018/TypeTestOperator_A01_t01: CompileTimeError
-LanguageFeatures/Constant-update-2018/TypeTestOperator_A01_t02: CompileTimeError
-LanguageFeatures/Constant-update-2018/TypeTestOperator_A02_t01: CompileTimeError
-LanguageFeatures/Constant-update-2018/TypeTestOperator_A02_t02: CompileTimeError
-LanguageFeatures/Constant_update2018/CastOperator_A01_t01: CompileTimeError
-LanguageFeatures/Constant_update2018/CastOperator_A02_t01: CompileTimeError
-LanguageFeatures/Constant_update2018/CastOperator_A02_t02: CompileTimeError
-LanguageFeatures/Constant_update2018/CastOperator_A03_t02/none: CompileTimeError
-LanguageFeatures/Constant_update2018/CastOperator_A04_t01/none: CompileTimeError
-LanguageFeatures/Constant_update2018/CastOperator_A04_t02/none: CompileTimeError
-LanguageFeatures/Constant_update2018/EqualityOperator_A01_t03/none: CompileTimeError
-LanguageFeatures/Constant_update2018/EqualityOperator_A01_t04/none: CompileTimeError
-LanguageFeatures/Constant_update2018/EqualityOperator_A01_t09: MissingCompileTimeError
-LanguageFeatures/Constant_update2018/EqualityOperator_A01_t10: MissingCompileTimeError
-LanguageFeatures/Constant_update2018/NewOperators_A01_t01: CompileTimeError
-LanguageFeatures/Constant_update2018/NewOperators_A01_t02: CompileTimeError
-LanguageFeatures/Constant_update2018/NewOperators_A02_t01: CompileTimeError
-LanguageFeatures/Constant_update2018/NewOperators_A02_t02: CompileTimeError
-LanguageFeatures/Constant_update2018/NewOperators_A02_t05: CompileTimeError
-LanguageFeatures/Constant_update2018/NewOperators_A02_t06: CompileTimeError
-LanguageFeatures/Constant_update2018/NewOperators_A02_t09: CompileTimeError
-LanguageFeatures/Constant_update2018/NewOperators_A02_t10: CompileTimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A01_t01: CompileTimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A01_t02/none: CompileTimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A01_t05/none: CompileTimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A01_t06/none: CompileTimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A01_t07: CompileTimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A02_t01: CompileTimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A02_t02/none: CompileTimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A02_t05/none: CompileTimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A02_t08: CompileTimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t01: CompileTimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t05: CompileTimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t06: CompileTimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t06/01: MissingCompileTimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t07: MissingCompileTimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t07/none: CompileTimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A04_t01: CompileTimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A04_t02/none: CompileTimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A04_t04/none: CompileTimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A04_t05: CompileTimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A04_t06/none: CompileTimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A04_t08/none: CompileTimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A04_t09: MissingCompileTimeError
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A04_t11: MissingCompileTimeError
-LanguageFeatures/Constant_update2018/TypeTestOperator_A01_t01: CompileTimeError
-LanguageFeatures/Constant_update2018/TypeTestOperator_A01_t02: CompileTimeError
-LanguageFeatures/Constant_update2018/TypeTestOperator_A02_t01: CompileTimeError
-LanguageFeatures/Constant_update2018/TypeTestOperator_A02_t02: CompileTimeError
-LanguageFeatures/Constant_update2018/TypeTestOperator_A03_t01/none: CompileTimeError
-LanguageFeatures/Constant_update2018/TypeTestOperator_A03_t02/none: CompileTimeError
-LanguageFeatures/Constant_update2018/TypeTestOperator_A03_t03/none: CompileTimeError
-LanguageFeatures/Constant_update2018/TypeTestOperator_A03_t04/none: CompileTimeError
-LanguageFeatures/Constant_update2018/TypeTestOperator_A04_t01/none: CompileTimeError
-LanguageFeatures/Constant_update2018/TypeTestOperator_A04_t02/none: CompileTimeError
LanguageFeatures/Instantiate-to-bound/class/dynamic/class_FutureOr_l1_t01: Crash
LanguageFeatures/Instantiate-to-bound/class/dynamic/class_FutureOr_l1_t02: CompileTimeError
LanguageFeatures/Instantiate-to-bound/class/dynamic/class_FutureOr_l1_t03: Crash
@@ -753,10 +670,6 @@
LanguageFeatures/regression/34803_t02: Crash
[ $arch == simdbc64 && $compiler == dartk ]
-LanguageFeatures/Constant_update2018/NewOperators_A02_t01: Pass
-LanguageFeatures/Constant_update2018/NewOperators_A02_t02: Pass
-LanguageFeatures/Constant_update2018/NewOperators_A02_t04: Pass
-LanguageFeatures/Constant_update2018/NewOperators_A02_t05: Pass
LibTest/collection/ListBase/ListBase_class_A01_t02: Crash # Issue http://dartbug.com/35242
LibTest/collection/ListMixin/ListMixin_class_A01_t02: Crash # Issue http://dartbug.com/35242
LibTest/core/List/List_class_A01_t02: Crash # Issue http://dartbug.com/35242
@@ -873,11 +786,6 @@
LibTest/io/Stdin/readByteSync_A02_t01: RuntimeError, Pass
LibTest/io/WebSocket/pingInterval_A01_t01: RuntimeError, Pass
-[ $runtime == none && $fasta ]
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t01: Crash
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t02: Crash
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t03: Pass
-
[ $runtime == vm && $system == linux && ($compiler == dartk || $compiler == dartkb) ]
LibTest/io/Link/stat_A01_t01: RuntimeError
LibTest/isolate/Isolate/spawn_A06_t03: Crash, Pass
@@ -1051,32 +959,6 @@
Language/Expressions/Logical_Boolean_Expressions/syntax_t01: RuntimeError
Language/Statements/Assert/execution_t08: RuntimeError
Language/Types/Function_Types/call_t01: RuntimeError
-LanguageFeatures/Constant_update2018/CastOperator_A01_t01: DartkCrash
-LanguageFeatures/Constant_update2018/CastOperator_A02_t01: DartkCrash
-LanguageFeatures/Constant_update2018/CastOperator_A02_t02: DartkCrash
-LanguageFeatures/Constant_update2018/CastOperator_A03_t01/02: Pass
-LanguageFeatures/Constant_update2018/CastOperator_A03_t01/03: Pass
-LanguageFeatures/Constant_update2018/CastOperator_A04_t01: Pass
-LanguageFeatures/Constant_update2018/EqualityOperator_A01_t03: Pass
-LanguageFeatures/Constant_update2018/EqualityOperator_A01_t04: Pass
-LanguageFeatures/Constant_update2018/NewOperators_A01_t01: DartkCrash
-LanguageFeatures/Constant_update2018/NewOperators_A01_t02: DartkCrash
-LanguageFeatures/Constant_update2018/NewOperators_A02_t01: Fail
-LanguageFeatures/Constant_update2018/NewOperators_A02_t02: DartkCrash
-LanguageFeatures/Constant_update2018/NewOperators_A02_t04: Fail
-LanguageFeatures/Constant_update2018/NewOperators_A02_t05: DartkCrash
-LanguageFeatures/Constant_update2018/NewOperators_A02_t07: Fail
-LanguageFeatures/Constant_update2018/ShortCircuitOperators_A03_t05: Pass
-LanguageFeatures/Constant_update2018/TypeTestOperator_A01_t01: DartkCrash
-LanguageFeatures/Constant_update2018/TypeTestOperator_A01_t02: DartkCrash
-LanguageFeatures/Constant_update2018/TypeTestOperator_A02_t01: DartkCrash
-LanguageFeatures/Constant_update2018/TypeTestOperator_A02_t02: DartkCrash
-LanguageFeatures/Constant_update2018/TypeTestOperator_A03_t01: Pass
-LanguageFeatures/Constant_update2018/TypeTestOperator_A03_t02: Pass
-LanguageFeatures/Constant_update2018/TypeTestOperator_A03_t03/01: Pass
-LanguageFeatures/Constant_update2018/TypeTestOperator_A03_t04/01: Pass
-LanguageFeatures/Constant_update2018/TypeTestOperator_A04_t01: Pass
-LanguageFeatures/Constant_update2018/TypeTestOperator_A04_t02: Pass
LanguageFeatures/Instantiate-to-bound/class/dynamic/class_typedef_l2_t06: RuntimeError
LanguageFeatures/Instantiate-to-bound/class/static/class_FutureOr_l1_t04/none: CompileTimeError
LanguageFeatures/Instantiate-to-bound/class/static/class_typedef_l1_t04/none: CompileTimeError