[cfe] Avoid crash on pattern switch statement in constant evaluator

In response to https://github.com/dart-lang/sdk/issues/53111

Change-Id: I4403b2c92fe983fcfc6d5cd8542c58d9468b5b26
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/317884
Reviewed-by: Jens Johansen <jensj@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
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 e088db7..a715e8e 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -5442,7 +5442,7 @@
   }
 }
 
-class StatementConstantEvaluator extends StatementVisitor<ExecutionStatus> {
+class StatementConstantEvaluator implements StatementVisitor<ExecutionStatus> {
   ConstantEvaluator exprEvaluator;
 
   StatementConstantEvaluator(this.exprEvaluator) {
@@ -5692,6 +5692,37 @@
     assert(condition is BoolConstant);
     return const ProceedStatus();
   }
+
+  @override
+  ExecutionStatus visitForInStatement(ForInStatement node) {
+    return new AbortStatus(exprEvaluator.createEvaluationErrorConstant(
+        node, templateConstEvalError.withArguments('For-in statement.')));
+  }
+
+  @override
+  ExecutionStatus visitIfCaseStatement(IfCaseStatement node) {
+    return new AbortStatus(exprEvaluator.createEvaluationErrorConstant(
+        node, templateConstEvalError.withArguments('If-case statement.')));
+  }
+
+  @override
+  ExecutionStatus visitPatternSwitchStatement(PatternSwitchStatement node) {
+    return new AbortStatus(exprEvaluator.createEvaluationErrorConstant(node,
+        templateConstEvalError.withArguments('Pattern switch statement.')));
+  }
+
+  @override
+  ExecutionStatus visitPatternVariableDeclaration(
+      PatternVariableDeclaration node) {
+    return new AbortStatus(exprEvaluator.createEvaluationErrorConstant(node,
+        templateConstEvalError.withArguments('Pattern variable declaration.')));
+  }
+
+  @override
+  ExecutionStatus visitYieldStatement(YieldStatement node) {
+    return new AbortStatus(exprEvaluator.createEvaluationErrorConstant(
+        node, templateConstEvalError.withArguments('Yield statement.')));
+  }
 }
 
 class ConstantCoverage {
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index 42f6375..676d7f6f 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -7,7 +7,7 @@
 # BAD ONES:
 class_modifiers/issue52115/main: SemiFuzzFailure # https://github.com/dart-lang/sdk/issues/53109
 class_modifiers/issue52316/main: SemiFuzzFailure # https://github.com/dart-lang/sdk/issues/53109
-const_functions/const_functions_switch_statements: SemiFuzzCrash # https://github.com/dart-lang/sdk/issues/53111
+const_functions/const_functions_switch_statements: SemiFuzzFailure # https://github.com/dart-lang/sdk/issues/53111
 inline_class/extension_types/has_export: SemiFuzzCrash # Unhandled ExtensionTypeDeclaration in finalizeExports - https://github.com/dart-lang/sdk/issues/53118.
 inline_class/has_export: SemiFuzzCrash # Unhandled ExtensionTypeDeclaration in finalizeExports - https://github.com/dart-lang/sdk/issues/53118.
 inline_class/extension_types/unresolved_type_extension_type_this: SemiFuzzCrash # Unhandled ExtensionTypeDeclaration in finalizeExports - https://github.com/dart-lang/sdk/issues/53118.