From 5f80bfd5d4e9636fd063200de45cb9c10318a60a Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 5 Aug 2020 16:33:21 +0300 Subject: [PATCH] [FIR] Don't report UNINITIALIZED_VARIABLE on lateinit local variable --- .../cfa/FirPropertyInitializationAnalyzer.kt | 2 ++ .../tests/lateinit/local/uninitialized.fir.kt | 24 ------------------- .../tests/lateinit/local/uninitialized.kt | 1 + 3 files changed, 3 insertions(+), 24 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/lateinit/local/uninitialized.fir.kt diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirPropertyInitializationAnalyzer.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirPropertyInitializationAnalyzer.kt index 2ef8e7b7aa5..66de5563e93 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirPropertyInitializationAnalyzer.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirPropertyInitializationAnalyzer.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange import org.jetbrains.kotlin.contracts.description.isDefinitelyVisited import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors +import org.jetbrains.kotlin.fir.declarations.isLateInit import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.resolve.dfa.cfg.CFGNode import org.jetbrains.kotlin.fir.resolve.dfa.cfg.ControlFlowGraph @@ -38,6 +39,7 @@ object FirPropertyInitializationAnalyzer : AbstractFirPropertyInitializationChec val reference = node.fir.calleeReference as? FirResolvedNamedReference ?: return val symbol = reference.resolvedSymbol as? FirPropertySymbol ?: return if (symbol !in localProperties) return + if (symbol.fir.isLateInit) return val kind = data.getValue(node)[symbol] ?: EventOccurrencesRange.ZERO if (!kind.isDefinitelyVisited()) { node.fir.source?.let { diff --git a/compiler/testData/diagnostics/tests/lateinit/local/uninitialized.fir.kt b/compiler/testData/diagnostics/tests/lateinit/local/uninitialized.fir.kt deleted file mode 100644 index dc2735b53da..00000000000 --- a/compiler/testData/diagnostics/tests/lateinit/local/uninitialized.fir.kt +++ /dev/null @@ -1,24 +0,0 @@ -// !LANGUAGE: +LateinitLocalVariables - -fun test1() { - lateinit var s: String - s.length -} - -fun test2() { - lateinit var s: String - run { - s = "" - } - s.length -} - -fun almostAlwaysTrue(): Boolean = true - -fun test3() { - lateinit var s: String - if (almostAlwaysTrue()) { - s = "" - } - s.length -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/lateinit/local/uninitialized.kt b/compiler/testData/diagnostics/tests/lateinit/local/uninitialized.kt index 090a7d0cce9..8c21c4e3258 100644 --- a/compiler/testData/diagnostics/tests/lateinit/local/uninitialized.kt +++ b/compiler/testData/diagnostics/tests/lateinit/local/uninitialized.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !LANGUAGE: +LateinitLocalVariables fun test1() {