+4
-2
@@ -646,7 +646,9 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor {
|
|||||||
// it is not actually correct way (#KT-28370) of computing context, but it's how was in OI
|
// it is not actually correct way (#KT-28370) of computing context, but it's how was in OI
|
||||||
// Fix of it is breaking change and allowed with NewDataFlowForTryExpressions language feature.
|
// Fix of it is breaking change and allowed with NewDataFlowForTryExpressions language feature.
|
||||||
// See [processTryBranchesWithNewDataFlowAlgorithm] function
|
// See [processTryBranchesWithNewDataFlowAlgorithm] function
|
||||||
ExpressionTypingContext tryOutputContext = getCleanedContextFromTryWithAssignmentsToVar(tryExpression, nothingInAllCatchBranches, context);
|
ExpressionTypingContext tryOutputContext = getCleanedContextFromTryWithAssignmentsToVar(tryExpression, nothingInAllCatchBranches, context)
|
||||||
|
.replaceExpectedType(NO_EXPECTED_TYPE)
|
||||||
|
.replaceContextDependency(INDEPENDENT);
|
||||||
|
|
||||||
KotlinTypeInfo result = TypeInfoFactoryKt.createTypeInfo(resultType, tryOutputContext);
|
KotlinTypeInfo result = TypeInfoFactoryKt.createTypeInfo(resultType, tryOutputContext);
|
||||||
|
|
||||||
@@ -713,7 +715,7 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor {
|
|||||||
PreliminaryLoopVisitor catchVisitor = PreliminaryLoopVisitor.visitCatchBlocks(tryExpression);
|
PreliminaryLoopVisitor catchVisitor = PreliminaryLoopVisitor.visitCatchBlocks(tryExpression);
|
||||||
ExpressionTypingContext catchOutputContextFromAllBranches = tryOutputContext.replaceDataFlowInfo(
|
ExpressionTypingContext catchOutputContextFromAllBranches = tryOutputContext.replaceDataFlowInfo(
|
||||||
catchVisitor.clearDataFlowInfoForAssignedLocalVariables(dataFlowInfoAfterTry, components.languageVersionSettings)
|
catchVisitor.clearDataFlowInfoForAssignedLocalVariables(dataFlowInfoAfterTry, components.languageVersionSettings)
|
||||||
);
|
).replaceContextDependency(INDEPENDENT).replaceExpectedType(NO_EXPECTED_TYPE);
|
||||||
KotlinTypeInfo finallyTypeInfo = facade.getTypeInfo(finallyBlock, catchOutputContextFromAllBranches);
|
KotlinTypeInfo finallyTypeInfo = facade.getTypeInfo(finallyBlock, catchOutputContextFromAllBranches);
|
||||||
DataFlowInfo finallyDataFlowInfo = finallyTypeInfo.getDataFlowInfo();
|
DataFlowInfo finallyDataFlowInfo = finallyTypeInfo.getDataFlowInfo();
|
||||||
resultDataFlowInfo = finallyDataFlowInfo.and(nonExceptionalTryCatchesOutputInfo);
|
resultDataFlowInfo = finallyDataFlowInfo.and(nonExceptionalTryCatchesOutputInfo);
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
// TARGET_BACKEND: JVM
|
||||||
|
// WITH_RUNTIME
|
||||||
|
// !LANGUAGE: +NewInference
|
||||||
|
|
||||||
|
val stack = mutableListOf<Int>()
|
||||||
|
|
||||||
|
fun <E> MutableList<E>.pop() = this.removeAt(size - 1)
|
||||||
|
|
||||||
|
fun foo() {}
|
||||||
|
|
||||||
|
fun getBoolean(): Boolean = true
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val b = getBoolean()
|
||||||
|
if (b) {
|
||||||
|
stack.add(1)
|
||||||
|
try {
|
||||||
|
return "OK"
|
||||||
|
} finally {
|
||||||
|
stack.pop()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
@@ -4888,6 +4888,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
runTest("compiler/testData/codegen/box/controlStructures/tryCatchFinallyChain.kt");
|
runTest("compiler/testData/codegen/box/controlStructures/tryCatchFinallyChain.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("tryFinallyGeneric.kt")
|
||||||
|
public void testTryFinallyGeneric() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/controlStructures/tryFinallyGeneric.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("compiler/testData/codegen/box/controlStructures/breakContinueInExpressions")
|
@TestMetadata("compiler/testData/codegen/box/controlStructures/breakContinueInExpressions")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
|||||||
+5
@@ -4888,6 +4888,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
runTest("compiler/testData/codegen/box/controlStructures/tryCatchFinallyChain.kt");
|
runTest("compiler/testData/codegen/box/controlStructures/tryCatchFinallyChain.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("tryFinallyGeneric.kt")
|
||||||
|
public void testTryFinallyGeneric() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/controlStructures/tryFinallyGeneric.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("compiler/testData/codegen/box/controlStructures/breakContinueInExpressions")
|
@TestMetadata("compiler/testData/codegen/box/controlStructures/breakContinueInExpressions")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
|||||||
+5
@@ -4888,6 +4888,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/controlStructures/tryCatchFinallyChain.kt");
|
runTest("compiler/testData/codegen/box/controlStructures/tryCatchFinallyChain.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("tryFinallyGeneric.kt")
|
||||||
|
public void testTryFinallyGeneric() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/controlStructures/tryFinallyGeneric.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("compiler/testData/codegen/box/controlStructures/breakContinueInExpressions")
|
@TestMetadata("compiler/testData/codegen/box/controlStructures/breakContinueInExpressions")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
|||||||
Reference in New Issue
Block a user