[FE 1.0] Correctly set USED_AS_EXPRESSION for unreachable catch clauses

^KT-48806 Fixed
This commit is contained in:
Dmitriy Novozhilov
2021-09-17 13:40:14 +03:00
committed by teamcityserver
parent 9ca8d39240
commit bfeb9c219d
10 changed files with 197 additions and 1 deletions
@@ -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 {
@@ -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)
}
}
}
}
}
@@ -9,6 +9,6 @@ FILE fqName:<root> fileName:/catchParameterAccess.kt
$this: GET_VAR 'f: kotlin.Function0<kotlin.Unit> declared in <root>.test' type=kotlin.Function0<kotlin.Unit> origin=VARIABLE_AS_FUNCTION
CATCH parameter=val e: java.lang.Exception{ kotlin.TypeAliasesKt.Exception } [val] declared in <root>.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 <root>.test' type=java.lang.Exception{ kotlin.TypeAliasesKt.Exception } origin=null
@@ -0,0 +1,20 @@
class A {
constructor() /* primary */ {
super/*Any*/()
/* <init>() */
}
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
}
+52
View File
@@ -0,0 +1,52 @@
FILE fqName:<root> fileName:/kt48806.kt
CLASS CLASS name:A modality:FINAL visibility:public superTypes:[kotlin.Any]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.A
CONSTRUCTOR visibility:public <> () returnType:<root>.A [primary]
BLOCK_BODY
DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [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 <init> () declared in java.lang.RuntimeException' type=java.lang.RuntimeException origin=null
CATCH parameter=val e: java.lang.Exception [val] declared in <root>.A.test_1
VAR name:e type:java.lang.Exception [val]
CONST Int type=kotlin.Int value=1
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test_1> visibility:public modality:FINAL <> ($this:<root>.A) returnType:kotlin.Int
correspondingProperty: PROPERTY name:test_1 visibility:public modality:FINAL [val]
$this: VALUE_PARAMETER name:<this> type:<root>.A
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun <get-test_1> (): kotlin.Int declared in <root>.A'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test_1 type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null
receiver: GET_VAR '<this>: <root>.A declared in <root>.A.<get-test_1>' type=<root>.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 <root>.A.test_2
VAR name:e type:java.lang.Exception [val]
THROW type=kotlin.Nothing
CONSTRUCTOR_CALL 'public constructor <init> () declared in java.lang.RuntimeException' type=java.lang.RuntimeException origin=null
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test_2> visibility:public modality:FINAL <> ($this:<root>.A) returnType:kotlin.Int
correspondingProperty: PROPERTY name:test_2 visibility:public modality:FINAL [val]
$this: VALUE_PARAMETER name:<this> type:<root>.A
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun <get-test_2> (): kotlin.Int declared in <root>.A'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test_2 type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null
receiver: GET_VAR '<this>: <root>.A declared in <root>.A.<get-test_2>' type=<root>.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:<this> 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:<this> 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:<this> type:kotlin.Any
+16
View File
@@ -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()
}
}
+28
View File
@@ -0,0 +1,28 @@
class A {
constructor() /* primary */ {
super/*Any*/()
/* <init>() */
}
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
}
+56
View File
@@ -0,0 +1,56 @@
FILE fqName:<root> fileName:/kt48806.kt
CLASS CLASS name:A modality:FINAL visibility:public superTypes:[kotlin.Any]
$this: VALUE_PARAMETER INSTANCE_RECEIVER name:<this> type:<root>.A
CONSTRUCTOR visibility:public <> () returnType:<root>.A [primary]
BLOCK_BODY
DELEGATING_CONSTRUCTOR_CALL 'public constructor <init> () [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 <init> () declared in java.lang.RuntimeException' type=java.lang.RuntimeException origin=null
CATCH parameter=val e: java.lang.Exception{ kotlin.TypeAliasesKt.Exception } [val] declared in <root>.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:<get-test_1> visibility:public modality:FINAL <> ($this:<root>.A) returnType:kotlin.Int
correspondingProperty: PROPERTY name:test_1 visibility:public modality:FINAL [val]
$this: VALUE_PARAMETER name:<this> type:<root>.A
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun <get-test_1> (): kotlin.Int declared in <root>.A'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test_1 type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null
receiver: GET_VAR '<this>: <root>.A declared in <root>.A.<get-test_1>' type=<root>.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 <root>.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 <init> () declared in java.lang.RuntimeException' type=java.lang.RuntimeException origin=null
FUN DEFAULT_PROPERTY_ACCESSOR name:<get-test_2> visibility:public modality:FINAL <> ($this:<root>.A) returnType:kotlin.Int
correspondingProperty: PROPERTY name:test_2 visibility:public modality:FINAL [val]
$this: VALUE_PARAMETER name:<this> type:<root>.A
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun <get-test_2> (): kotlin.Int declared in <root>.A'
GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:test_2 type:kotlin.Int visibility:private [final]' type=kotlin.Int origin=null
receiver: GET_VAR '<this>: <root>.A declared in <root>.A.<get-test_2>' type=<root>.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:<this> 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:<this> 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:<this> type:kotlin.Any
@@ -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 {
@@ -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");