From 0f4275a4438dc08ecc75a2f120c4e84ac845d393 Mon Sep 17 00:00:00 2001 From: Konstantin Shcheglov Date: Thu, 27 Apr 2023 21:22:48 +0000 Subject: [PATCH] Issue 52197. Remove null assert from getEnumElementValue() I see a crash like this from external users. Bug: https://github.com/dart-lang/sdk/issues/52197 Change-Id: I5b18552ae1db50c7a103ee6b04f36d0ade8c6f5d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/299180 Commit-Queue: Konstantin Shcheglov Reviewed-by: Samuel Rawlins --- .../lib/src/exhaustiveness/types/enum.dart | 20 ++++++++++--------- .../lib/src/generated/exhaustiveness.dart | 4 ++-- .../non_exhaustive_switch_test.dart | 20 +++++++++++++++++++ 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/pkg/_fe_analyzer_shared/lib/src/exhaustiveness/types/enum.dart b/pkg/_fe_analyzer_shared/lib/src/exhaustiveness/types/enum.dart index d2e73739be8..be3becaf8df 100644 --- a/pkg/_fe_analyzer_shared/lib/src/exhaustiveness/types/enum.dart +++ b/pkg/_fe_analyzer_shared/lib/src/exhaustiveness/types/enum.dart @@ -17,7 +17,7 @@ abstract class EnumOperations> elements = {}; for (EnumElement element in _enumOperations.getEnumElements(_enumClass)) { - EnumElementValue value = _enumOperations.getEnumElementValue(element); - elements[value] = new EnumElementStaticType( - _typeOperations, - _fieldLookup, - _enumOperations.getEnumElementType(element), - new IdentityRestriction(element), - _enumOperations.getEnumElementName(element), - element); + EnumElementValue? value = _enumOperations.getEnumElementValue(element); + if (value != null) { + elements[value] = new EnumElementStaticType( + _typeOperations, + _fieldLookup, + _enumOperations.getEnumElementType(element), + new IdentityRestriction(element), + _enumOperations.getEnumElementName(element), + element); + } } return elements; } diff --git a/pkg/analyzer/lib/src/generated/exhaustiveness.dart b/pkg/analyzer/lib/src/generated/exhaustiveness.dart index 08eec6ff422..1976aec3c50 100644 --- a/pkg/analyzer/lib/src/generated/exhaustiveness.dart +++ b/pkg/analyzer/lib/src/generated/exhaustiveness.dart @@ -56,8 +56,8 @@ class AnalyzerEnumOperations } @override - DartObject getEnumElementValue(FieldElement enumField) { - return enumField.computeConstantValue()!; + DartObject? getEnumElementValue(FieldElement enumField) { + return enumField.computeConstantValue(); } } diff --git a/pkg/analyzer/test/src/diagnostics/non_exhaustive_switch_test.dart b/pkg/analyzer/test/src/diagnostics/non_exhaustive_switch_test.dart index ce1a4c2a949..2aecdca3a54 100644 --- a/pkg/analyzer/test/src/diagnostics/non_exhaustive_switch_test.dart +++ b/pkg/analyzer/test/src/diagnostics/non_exhaustive_switch_test.dart @@ -239,6 +239,26 @@ void f(E x) { ); } + test_alwaysExhaustive_enum_cannotCompute() async { + await assertErrorsInCode(r''' +enum E { + v1(v2), v2(v1); + const E(Object f); +} + +void f(E x) { + switch (x) { + case E.v1: + case E.v2: + break; + } +} +''', [ + error(CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT, 11, 2), + error(CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT, 19, 2), + ]); + } + test_alwaysExhaustive_Null_hasError() async { await assertErrorsInCode(r''' void f(Null x) {