diff --git a/build.gradle.kts b/build.gradle.kts index 7139916b9b7..8ea5580e3c7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,7 +8,7 @@ buildscript { extra["defaultSnapshotVersion"] = "1.3-SNAPSHOT" val cacheRedirectorEnabled = findProperty("cacheRedirectorEnabled")?.toString()?.toBoolean() == true - kotlinBootstrapFrom(BootstrapOption.BintrayBootstrap("1.3.70-dev-1416", cacheRedirectorEnabled)) + kotlinBootstrapFrom(BootstrapOption.BintrayBootstrap("1.3.70-dev-1806", cacheRedirectorEnabled)) repositories { bootstrapKotlinRepo?.let(::maven) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt index 2d88cb065a2..c629f283f89 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt @@ -638,9 +638,9 @@ class FirDataFlowAnalyzer(private val components: FirAbstractBodyResolveTransfor * x.length * } */ + val realVariable = getOrCreateRealVariable(variable) + requireNotNull(realVariable) variableStorage[initializer]?.takeIf { it.isSynthetic() }?.let { initializerVariable -> - val realVariable = getOrCreateRealVariable(variable) - requireNotNull(realVariable) logicSystem.changeVariableForConditionFlow(node.flow, initializerVariable, realVariable) } @@ -648,6 +648,21 @@ class FirDataFlowAnalyzer(private val components: FirAbstractBodyResolveTransfor getOrCreateRealVariable(initializer)?.let { rhsVariable -> variableStorage.createAliasVariable(variable.symbol, rhsVariable) } + + getRealVariablesForSafeCallChain(initializer).takeIf { it.isNotEmpty() }?.let { + val flow = node.flow + for (variableFromSafeCall in it) { + logicSystem.addConditionalInfo( + flow, + variableFromSafeCall, + ConditionalFirDataFlowInfo( + NotEqNull, + realVariable, + FirDataFlowInfo(setOf(session.builtinTypes.anyType.coneTypeUnsafe()), emptySet()) + ) + ) + } + } } fun exitVariableAssignment(assignment: FirVariableAssignment) { diff --git a/compiler/fir/resolve/testData/resolve/smartcasts/anotherBoundSmartcasts.kt b/compiler/fir/resolve/testData/resolve/smartcasts/anotherBoundSmartcasts.kt new file mode 100644 index 00000000000..54a2315b81c --- /dev/null +++ b/compiler/fir/resolve/testData/resolve/smartcasts/anotherBoundSmartcasts.kt @@ -0,0 +1,21 @@ +interface A { + fun foo(): Int + + val x: Int + + fun bar() +} + +fun test_1(a: A?) { + val x = a?.x + if (x != null) { + a.bar() + } +} + +fun test_2(a: A?) { + val x = a?.foo() + if (x != null) { + a.bar() + } +} \ No newline at end of file diff --git a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithCfgTestGenerated.java b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithCfgTestGenerated.java index 72e606a7efe..53c0b94839d 100644 --- a/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithCfgTestGenerated.java +++ b/compiler/fir/resolve/tests/org/jetbrains/kotlin/fir/FirDiagnosticsWithCfgTestGenerated.java @@ -118,6 +118,11 @@ public class FirDiagnosticsWithCfgTestGenerated extends AbstractFirDiagnosticsWi KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/fir/resolve/testData/resolve/smartcasts"), Pattern.compile("^([^.]+)\\.kt$"), true); } + @TestMetadata("anotherBoundSmartcasts.kt") + public void testAnotherBoundSmartcasts() throws Exception { + runTest("compiler/fir/resolve/testData/resolve/smartcasts/anotherBoundSmartcasts.kt"); + } + @TestMetadata("bangbang.kt") public void testBangbang() throws Exception { runTest("compiler/fir/resolve/testData/resolve/smartcasts/bangbang.kt");