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) {