[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