[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.