FIR2IR insert implicit cast on elvis RHS

This commit is contained in:
Dmitry Petrov
2021-11-24 15:15:47 +03:00
committed by Space
parent badfade2fd
commit 91b1814b02
9 changed files with 125 additions and 9 deletions
@@ -1,6 +1,4 @@
// TARGET_BACKEND: JVM
// IGNORE_BACKEND_FIR: JVM_IR
// FIR status: Fail: should have been an exception in 'bar()'
// MODULE: lib
// FILE: RightElvisOperand.java
@@ -0,0 +1,23 @@
Module: lib
Module: main
FILE fqName:<root> fileName:/nullCheckInElvisRhs.kt
FUN name:baz visibility:public modality:FINAL <> () returnType:kotlin.String?
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun baz (): kotlin.String? declared in <root>'
CONST Null type=kotlin.Nothing? value=null
FUN name:test visibility:public modality:FINAL <> () returnType:kotlin.String
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun test (): kotlin.String declared in <root>'
BLOCK type=kotlin.String origin=ELVIS
VAR IR_TEMPORARY_VARIABLE name:tmp_0 type:kotlin.String? [val]
CALL 'public final fun baz (): kotlin.String? declared in <root>' type=kotlin.String? origin=null
WHEN type=kotlin.String origin=ELVIS
BRANCH
if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ
arg0: GET_VAR 'val tmp_0: kotlin.String? [val] declared in <root>.test' type=kotlin.String? origin=null
arg1: CONST Null type=kotlin.Nothing? value=null
then: TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String
CALL 'public/*package*/ open fun foo (): @[FlexibleNullability] kotlin.String? declared in <root>.RightElvisOperand' type=@[FlexibleNullability] kotlin.String? origin=null
BRANCH
if: CONST Boolean type=kotlin.Boolean value=true
then: GET_VAR 'val tmp_0: kotlin.String? [val] declared in <root>.test' type=kotlin.String? origin=null
@@ -0,0 +1,17 @@
// MODULE: lib
// MODULE: main
// FILE: nullCheckInElvisRhs.kt
fun baz(): String? {
return null
}
fun test(): String {
return { // BLOCK
val <elvis>: String? = baz()
when {
EQEQ(arg0 = <elvis>, arg1 = null) -> foo() /*!! String */
else -> <elvis>
}
}
}
@@ -0,0 +1,23 @@
Module: lib
Module: main
FILE fqName:<root> fileName:/nullCheckInElvisRhs.kt
FUN name:baz visibility:public modality:FINAL <> () returnType:kotlin.String?
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun baz (): kotlin.String? declared in <root>'
CONST Null type=kotlin.Nothing? value=null
FUN name:test visibility:public modality:FINAL <> () returnType:kotlin.String
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun test (): kotlin.String declared in <root>'
BLOCK type=kotlin.String origin=ELVIS
VAR IR_TEMPORARY_VARIABLE name:tmp_0 type:kotlin.String? [val]
CALL 'public final fun baz (): kotlin.String? declared in <root>' type=kotlin.String? origin=null
WHEN type=kotlin.String origin=null
BRANCH
if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ
arg0: GET_VAR 'val tmp_0: kotlin.String? [val] declared in <root>.test' type=kotlin.String? origin=null
arg1: CONST Null type=kotlin.Nothing? value=null
then: TYPE_OP type=kotlin.String origin=IMPLICIT_NOTNULL typeOperand=kotlin.String
CALL 'public/*package*/ open fun foo (): @[FlexibleNullability] kotlin.String? declared in <root>.RightElvisOperand' type=@[FlexibleNullability] kotlin.String? origin=null
BRANCH
if: CONST Boolean type=kotlin.Boolean value=true
then: GET_VAR 'val tmp_0: kotlin.String? [val] declared in <root>.test' type=kotlin.String? origin=null
@@ -0,0 +1,17 @@
// TARGET_BACKEND: JVM
// MODULE: lib
// FILE: RightElvisOperand.java
class RightElvisOperand {
static String foo() {
return null;
}
}
// MODULE: main(lib)
// FILE: nullCheckInElvisRhs.kt
fun baz(): String? = null
fun test(): String = baz() ?: RightElvisOperand.foo()
@@ -0,0 +1,18 @@
// MODULE: lib
// MODULE: main
// FILE: nullCheckInElvisRhs.kt
fun baz(): String? {
return null
}
fun test(): String {
return { // BLOCK
val tmp0_elvis_lhs: String? = baz()
when {
EQEQ(arg0 = tmp0_elvis_lhs, arg1 = null) -> foo() /*!! String */
else -> tmp0_elvis_lhs
}
}
}