From bfeb9c219d573b88ae55823d98dcc86095717d3b Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Fri, 17 Sep 2021 13:40:14 +0300 Subject: [PATCH] [FE 1.0] Correctly set USED_AS_EXPRESSION for unreachable catch clauses ^KT-48806 Fixed --- .../runners/ir/Fir2IrTextTestGenerated.java | 6 ++ .../cfg/ControlFlowInformationProviderImpl.kt | 7 +++ .../expressions/catchParameterAccess.txt | 2 +- .../ir/irText/expressions/kt48806.fir.kt.txt | 20 +++++++ .../ir/irText/expressions/kt48806.fir.txt | 52 +++++++++++++++++ .../testData/ir/irText/expressions/kt48806.kt | 16 ++++++ .../ir/irText/expressions/kt48806.kt.txt | 28 ++++++++++ .../ir/irText/expressions/kt48806.txt | 56 +++++++++++++++++++ .../test/runners/ir/IrTextTestGenerated.java | 6 ++ .../kotlin/ir/KlibTextTestCaseGenerated.java | 5 ++ 10 files changed, 197 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/ir/irText/expressions/kt48806.fir.kt.txt create mode 100644 compiler/testData/ir/irText/expressions/kt48806.fir.txt create mode 100644 compiler/testData/ir/irText/expressions/kt48806.kt create mode 100644 compiler/testData/ir/irText/expressions/kt48806.kt.txt create mode 100644 compiler/testData/ir/irText/expressions/kt48806.txt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java index 45d5d39ee04..c9c16d172d6 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java @@ -1460,6 +1460,12 @@ public class Fir2IrTextTestGenerated extends AbstractFir2IrTextTest { runTest("compiler/testData/ir/irText/expressions/kt48708.kt"); } + @Test + @TestMetadata("kt48806.kt") + public void testKt48806() throws Exception { + runTest("compiler/testData/ir/irText/expressions/kt48806.kt"); + } + @Test @TestMetadata("lambdaInCAO.kt") public void testLambdaInCAO() throws Exception { diff --git a/compiler/frontend/cfg/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProviderImpl.kt b/compiler/frontend/cfg/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProviderImpl.kt index 83714186531..79b116017a8 100644 --- a/compiler/frontend/cfg/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProviderImpl.kt +++ b/compiler/frontend/cfg/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProviderImpl.kt @@ -807,6 +807,13 @@ class ControlFlowInformationProviderImpl private constructor( for (element in pseudocode.getValueElements(value)) { trace.record(USED_AS_EXPRESSION, element, isUsedAsExpression) trace.record(USED_AS_RESULT_OF_LAMBDA, element, isUsedAsResultOfLambda) + if (isUsedAsExpression && element is KtTryExpression) { + trace.record(USED_AS_EXPRESSION, element.tryBlock, true) + for (catchClause in element.catchClauses) { + val body = catchClause.catchBody ?: continue + trace.record(USED_AS_EXPRESSION, body, true) + } + } } } } diff --git a/compiler/testData/ir/irText/expressions/catchParameterAccess.txt b/compiler/testData/ir/irText/expressions/catchParameterAccess.txt index a1690295ade..5ca5f24f85c 100644 --- a/compiler/testData/ir/irText/expressions/catchParameterAccess.txt +++ b/compiler/testData/ir/irText/expressions/catchParameterAccess.txt @@ -9,6 +9,6 @@ FILE fqName: fileName:/catchParameterAccess.kt $this: GET_VAR 'f: kotlin.Function0 declared in .test' type=kotlin.Function0 origin=VARIABLE_AS_FUNCTION CATCH parameter=val e: java.lang.Exception{ kotlin.TypeAliasesKt.Exception } [val] declared in .test VAR CATCH_PARAMETER name:e type:java.lang.Exception{ kotlin.TypeAliasesKt.Exception } [val] - BLOCK type=kotlin.Unit origin=null + BLOCK type=kotlin.Nothing origin=null THROW type=kotlin.Nothing GET_VAR 'val e: java.lang.Exception{ kotlin.TypeAliasesKt.Exception } [val] declared in .test' type=java.lang.Exception{ kotlin.TypeAliasesKt.Exception } origin=null diff --git a/compiler/testData/ir/irText/expressions/kt48806.fir.kt.txt b/compiler/testData/ir/irText/expressions/kt48806.fir.kt.txt new file mode 100644 index 00000000000..0538ba6b047 --- /dev/null +++ b/compiler/testData/ir/irText/expressions/kt48806.fir.kt.txt @@ -0,0 +1,20 @@ +class A { + constructor() /* primary */ { + super/*Any*/() + /* () */ + + } + + val test_1: Int + field = try throw RuntimeException() + catch (e: Exception)1 + + get + + val test_2: Int + field = try 1 + catch (e: Exception)throw RuntimeException() + + get + +} diff --git a/compiler/testData/ir/irText/expressions/kt48806.fir.txt b/compiler/testData/ir/irText/expressions/kt48806.fir.txt new file mode 100644 index 00000000000..0e1bd224cad --- /dev/null +++ b/compiler/testData/ir/irText/expressions/kt48806.fir.txt @@ -0,0 +1,52 @@ +FILE fqName: fileName:/kt48806.kt + CLASS CLASS name:A modality:FINAL visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.A + CONSTRUCTOR visibility:public <> () returnType:.A [primary] + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:A modality:FINAL visibility:public superTypes:[kotlin.Any]' + PROPERTY name:test_1 visibility:public modality:FINAL [val] + FIELD PROPERTY_BACKING_FIELD name:test_1 type:kotlin.Int visibility:private [final] + EXPRESSION_BODY + TRY type=kotlin.Int + try: THROW type=kotlin.Nothing + CONSTRUCTOR_CALL 'public constructor () declared in java.lang.RuntimeException' type=java.lang.RuntimeException origin=null + CATCH parameter=val e: java.lang.Exception [val] declared in .A.test_1 + VAR name:e type:java.lang.Exception [val] + CONST Int type=kotlin.Int value=1 + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:.A) returnType:kotlin.Int + correspondingProperty: PROPERTY name:test_1 visibility:public modality:FINAL [val] + $this: VALUE_PARAMETER name: type:.A + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.Int declared in .A' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test_1 type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null + receiver: GET_VAR ': .A declared in .A.' type=.A origin=null + PROPERTY name:test_2 visibility:public modality:FINAL [val] + FIELD PROPERTY_BACKING_FIELD name:test_2 type:kotlin.Int visibility:private [final] + EXPRESSION_BODY + TRY type=kotlin.Int + try: CONST Int type=kotlin.Int value=1 + CATCH parameter=val e: java.lang.Exception [val] declared in .A.test_2 + VAR name:e type:java.lang.Exception [val] + THROW type=kotlin.Nothing + CONSTRUCTOR_CALL 'public constructor () declared in java.lang.RuntimeException' type=java.lang.RuntimeException origin=null + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:.A) returnType:kotlin.Int + correspondingProperty: PROPERTY name:test_2 visibility:public modality:FINAL [val] + $this: VALUE_PARAMETER name: type:.A + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.Int declared in .A' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test_2 type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null + receiver: GET_VAR ': .A declared in .A.' type=.A origin=null + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any diff --git a/compiler/testData/ir/irText/expressions/kt48806.kt b/compiler/testData/ir/irText/expressions/kt48806.kt new file mode 100644 index 00000000000..8f692871529 --- /dev/null +++ b/compiler/testData/ir/irText/expressions/kt48806.kt @@ -0,0 +1,16 @@ +// ISSUE: KT-48806 + +class A { + val test_1: Int = try{ + throw RuntimeException() + } catch(e: Exception) { + 1 + } + + val test_2: Int = try{ + 1 + } catch(e: Exception) { + throw RuntimeException() + } +} + diff --git a/compiler/testData/ir/irText/expressions/kt48806.kt.txt b/compiler/testData/ir/irText/expressions/kt48806.kt.txt new file mode 100644 index 00000000000..66625aad13f --- /dev/null +++ b/compiler/testData/ir/irText/expressions/kt48806.kt.txt @@ -0,0 +1,28 @@ +class A { + constructor() /* primary */ { + super/*Any*/() + /* () */ + + } + + val test_1: Int + field = try { // BLOCK + throw RuntimeException() + } + catch (e: Exception){ // BLOCK + 1 + } + + get + + val test_2: Int + field = try { // BLOCK + 1 + } + catch (e: Exception){ // BLOCK + throw RuntimeException() + } + + get + +} diff --git a/compiler/testData/ir/irText/expressions/kt48806.txt b/compiler/testData/ir/irText/expressions/kt48806.txt new file mode 100644 index 00000000000..e8c2cc1867d --- /dev/null +++ b/compiler/testData/ir/irText/expressions/kt48806.txt @@ -0,0 +1,56 @@ +FILE fqName: fileName:/kt48806.kt + CLASS CLASS name:A modality:FINAL visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.A + CONSTRUCTOR visibility:public <> () returnType:.A [primary] + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:A modality:FINAL visibility:public superTypes:[kotlin.Any]' + PROPERTY name:test_1 visibility:public modality:FINAL [val] + FIELD PROPERTY_BACKING_FIELD name:test_1 type:kotlin.Int visibility:private [final] + EXPRESSION_BODY + TRY type=kotlin.Int + try: BLOCK type=kotlin.Nothing origin=null + THROW type=kotlin.Nothing + CONSTRUCTOR_CALL 'public constructor () declared in java.lang.RuntimeException' type=java.lang.RuntimeException origin=null + CATCH parameter=val e: java.lang.Exception{ kotlin.TypeAliasesKt.Exception } [val] declared in .A.test_1 + VAR CATCH_PARAMETER name:e type:java.lang.Exception{ kotlin.TypeAliasesKt.Exception } [val] + BLOCK type=kotlin.Int origin=null + CONST Int type=kotlin.Int value=1 + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:.A) returnType:kotlin.Int + correspondingProperty: PROPERTY name:test_1 visibility:public modality:FINAL [val] + $this: VALUE_PARAMETER name: type:.A + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.Int declared in .A' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test_1 type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null + receiver: GET_VAR ': .A declared in .A.' type=.A origin=null + PROPERTY name:test_2 visibility:public modality:FINAL [val] + FIELD PROPERTY_BACKING_FIELD name:test_2 type:kotlin.Int visibility:private [final] + EXPRESSION_BODY + TRY type=kotlin.Int + try: BLOCK type=kotlin.Int origin=null + CONST Int type=kotlin.Int value=1 + CATCH parameter=val e: java.lang.Exception{ kotlin.TypeAliasesKt.Exception } [val] declared in .A.test_2 + VAR CATCH_PARAMETER name:e type:java.lang.Exception{ kotlin.TypeAliasesKt.Exception } [val] + BLOCK type=kotlin.Nothing origin=null + THROW type=kotlin.Nothing + CONSTRUCTOR_CALL 'public constructor () declared in java.lang.RuntimeException' type=java.lang.RuntimeException origin=null + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:.A) returnType:kotlin.Int + correspondingProperty: PROPERTY name:test_2 visibility:public modality:FINAL [val] + $this: VALUE_PARAMETER name: type:.A + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.Int declared in .A' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test_2 type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null + receiver: GET_VAR ': .A declared in .A.' type=.A origin=null + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java index 418ba624ec3..6dca937df61 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java @@ -1460,6 +1460,12 @@ public class IrTextTestGenerated extends AbstractIrTextTest { runTest("compiler/testData/ir/irText/expressions/kt48708.kt"); } + @Test + @TestMetadata("kt48806.kt") + public void testKt48806() throws Exception { + runTest("compiler/testData/ir/irText/expressions/kt48806.kt"); + } + @Test @TestMetadata("lambdaInCAO.kt") public void testLambdaInCAO() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/ir/KlibTextTestCaseGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/ir/KlibTextTestCaseGenerated.java index 8c274e48c83..efd5efc2280 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/ir/KlibTextTestCaseGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/ir/KlibTextTestCaseGenerated.java @@ -1133,6 +1133,11 @@ public class KlibTextTestCaseGenerated extends AbstractKlibTextTestCase { runTest("compiler/testData/ir/irText/expressions/kt48708.kt"); } + @TestMetadata("kt48806.kt") + public void testKt48806() throws Exception { + runTest("compiler/testData/ir/irText/expressions/kt48806.kt"); + } + @TestMetadata("lambdaInCAO.kt") public void testLambdaInCAO() throws Exception { runTest("compiler/testData/ir/irText/expressions/lambdaInCAO.kt");