diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 4e1c87dfc7c..be40041fe58 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -40424,6 +40424,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/smartCasts/kt44942.kt"); } + @Test + @TestMetadata("kt48163_smartCastToThrowable.kt") + public void testKt48163_smartCastToThrowable() throws Exception { + runTest("compiler/testData/codegen/box/smartCasts/kt48163_smartCastToThrowable.kt"); + } + @Test @TestMetadata("lambdaArgumentWithoutType.kt") public void testLambdaArgumentWithoutType() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBytecodeTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBytecodeTextTestGenerated.java index 80544bb2174..46b3d4d16c0 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBytecodeTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBytecodeTextTestGenerated.java @@ -91,6 +91,12 @@ public class FirBytecodeTextTestGenerated extends AbstractFirBytecodeTextTest { runTest("compiler/testData/codegen/bytecodeText/charConstant.kt"); } + @Test + @TestMetadata("checkcastOnThrow.kt") + public void testCheckcastOnThrow() throws Exception { + runTest("compiler/testData/codegen/bytecodeText/checkcastOnThrow.kt"); + } + @Test @TestMetadata("collectionStubs.kt") public void testCollectionStubs() throws Exception { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt index a68cc5f09e4..b0d0d71fad5 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt @@ -1327,12 +1327,11 @@ class ExpressionCodegen( override fun visitThrow(expression: IrThrow, data: BlockInfo): PromisedValue { expression.markLineNumber(startOffset = true) val exception = expression.value.accept(this, data) - // Avoid unecessary CHECKCASTs to java/lang/Throwable. If the exception is not of type Object - // then it must be some subtype of throwable and we don't need to coerce it. - if (exception.type == OBJECT_TYPE) - exception.materializeAt(context.irBuiltIns.throwableType) - else + // Avoid unnecessary CHECKCASTs to java/lang/Throwable. + if (exception.irType.isSubtypeOfClass(context.irBuiltIns.throwableClass)) exception.materialize() + else + exception.materializeAt(context.irBuiltIns.throwableType) mv.athrow() return unitValue } diff --git a/compiler/testData/codegen/box/smartCasts/kt48163_smartCastToThrowable.kt b/compiler/testData/codegen/box/smartCasts/kt48163_smartCastToThrowable.kt new file mode 100644 index 00000000000..bb4ed0e4c43 --- /dev/null +++ b/compiler/testData/codegen/box/smartCasts/kt48163_smartCastToThrowable.kt @@ -0,0 +1,19 @@ +// TARGET_BACKEND: JVM + +import java.io.Serializable + +fun bar(s: Serializable) { + when (s) { + is Exception -> throw s + else -> Unit + } +} + +fun box(): String { + try { + bar(Exception("OK")) + return "Fail" + } catch (e: Exception) { + return e.message!! + } +} diff --git a/compiler/testData/codegen/bytecodeText/checkcastOnThrow.kt b/compiler/testData/codegen/bytecodeText/checkcastOnThrow.kt new file mode 100644 index 00000000000..a4d8cce80be --- /dev/null +++ b/compiler/testData/codegen/bytecodeText/checkcastOnThrow.kt @@ -0,0 +1,9 @@ +// TARGET_BACKEND: JVM_IR + +fun f(x: Throwable) { throw x } +fun f(x: Exception) { throw x } +fun f(x: RuntimeException) { throw x } +fun f(x: Error) { throw x } +fun f(x: AssertionError) { throw x } + +// 0 CHECKCAST diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index 92b489b50bc..26569c7d5b1 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -40262,6 +40262,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/smartCasts/kt44942.kt"); } + @Test + @TestMetadata("kt48163_smartCastToThrowable.kt") + public void testKt48163_smartCastToThrowable() throws Exception { + runTest("compiler/testData/codegen/box/smartCasts/kt48163_smartCastToThrowable.kt"); + } + @Test @TestMetadata("lambdaArgumentWithoutType.kt") public void testLambdaArgumentWithoutType() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index be6cbfd0c2d..ef67ae22a7e 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -40424,6 +40424,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/smartCasts/kt44942.kt"); } + @Test + @TestMetadata("kt48163_smartCastToThrowable.kt") + public void testKt48163_smartCastToThrowable() throws Exception { + runTest("compiler/testData/codegen/box/smartCasts/kt48163_smartCastToThrowable.kt"); + } + @Test @TestMetadata("lambdaArgumentWithoutType.kt") public void testLambdaArgumentWithoutType() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBytecodeTextTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBytecodeTextTestGenerated.java index 3986d6ea758..d05d5e0d6ba 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBytecodeTextTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBytecodeTextTestGenerated.java @@ -91,6 +91,12 @@ public class IrBytecodeTextTestGenerated extends AbstractIrBytecodeTextTest { runTest("compiler/testData/codegen/bytecodeText/charConstant.kt"); } + @Test + @TestMetadata("checkcastOnThrow.kt") + public void testCheckcastOnThrow() throws Exception { + runTest("compiler/testData/codegen/bytecodeText/checkcastOnThrow.kt"); + } + @Test @TestMetadata("collectionStubs.kt") public void testCollectionStubs() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index c8d34d3383f..69369b6a579 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -32290,6 +32290,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/smartCasts/kt44942.kt"); } + @TestMetadata("kt48163_smartCastToThrowable.kt") + public void testKt48163_smartCastToThrowable() throws Exception { + runTest("compiler/testData/codegen/box/smartCasts/kt48163_smartCastToThrowable.kt"); + } + @TestMetadata("lambdaArgumentWithoutType.kt") public void testLambdaArgumentWithoutType() throws Exception { runTest("compiler/testData/codegen/box/smartCasts/lambdaArgumentWithoutType.kt");