diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUninitializedEnumChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUninitializedEnumChecker.kt index 2a2b4152528..7a62d6e54d6 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUninitializedEnumChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUninitializedEnumChecker.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.analysis.checkers.expression import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.descriptors.ClassKind +import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.FirSession @@ -17,6 +18,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.containingClassForStaticMemberAttr import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.isEnumClass +import org.jetbrains.kotlin.fir.declarations.utils.visibility import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.references.toResolvedBaseSymbol import org.jetbrains.kotlin.fir.references.toResolvedNamedFunctionSymbol @@ -79,6 +81,12 @@ object FirUninitializedEnumChecker : FirQualifiedAccessExpressionChecker() { // We're looking for members/entries/companion object in an enum class or members in companion object of an enum class. if (!enumClassSymbol.isEnumClass) return + // Local enum class are prohibited + // So report error on access of local enum entry + if (enumClassSymbol.visibility == Visibilities.Local) { + reporter.reportOn(source, FirErrors.UNINITIALIZED_ENUM_ENTRY, calleeSymbol as FirEnumEntrySymbol, context) + } + // An accessed context within the enum class of interest. We should look up until either enum members or enum entries are found, // not just last containing declaration. For example, // enum class Fruit(...) { diff --git a/compiler/testData/diagnostics/tests/enum/localEnums.fir.kt b/compiler/testData/diagnostics/tests/enum/localEnums.fir.kt deleted file mode 100644 index e786e0a83ef..00000000000 --- a/compiler/testData/diagnostics/tests/enum/localEnums.fir.kt +++ /dev/null @@ -1,20 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_VARIABLE - -fun foo() { - enum class A { - FOO, - BAR - } - val foo = A.FOO - val b = object { - enum class B {} - } - class C { - enum class D {} - } - val f = { - enum class E {} - } - - enum class {} -} diff --git a/compiler/testData/diagnostics/tests/enum/localEnums.kt b/compiler/testData/diagnostics/tests/enum/localEnums.kt index 83fafb81034..fa2576e5c78 100644 --- a/compiler/testData/diagnostics/tests/enum/localEnums.kt +++ b/compiler/testData/diagnostics/tests/enum/localEnums.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_VARIABLE fun foo() {