[FE 1.0] Correctly set USED_AS_EXPRESSION for unreachable catch clauses
^KT-48806 Fixed
This commit is contained in:
committed by
teamcityserver
parent
9ca8d39240
commit
bfeb9c219d
Generated
+6
@@ -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 {
|
||||
|
||||
+7
@@ -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
|
||||
|
||||
}
|
||||
@@ -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
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
}
|
||||
@@ -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
|
||||
Generated
+6
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user