FIR2IR: make IrGetValue type consistent with IrVariable type

#KT-55458 Fixed
This commit is contained in:
Mikhail Glukhikh
2023-01-31 10:27:57 +01:00
committed by Space Team
parent 1c4d9175e7
commit f0ea8ab81b
8 changed files with 13 additions and 11 deletions
@@ -1210,6 +1210,9 @@ class Fir2IrDeclarationStorage(
irParent: IrDeclarationParent,
givenOrigin: IrDeclarationOrigin? = null
): IrVariable = convertCatching(variable) {
// Note: for components call, we have to change type here (to original component type) to keep compatibility with PSI2IR
// Some backend optimizations related to withIndex() probably depend on this type: index should always be Int
// See e.g. forInStringWithIndexWithExplicitlyTypedIndexVariable.kt from codegen box tests
val type = ((variable.initializer as? FirComponentCall)?.typeRef ?: variable.returnTypeRef).toIrType()
// Some temporary variables are produced in RawFirBuilder, but we consistently use special names for them.
val origin = when {
@@ -458,7 +458,10 @@ class CallAndReferenceGenerator(
is IrValueSymbol -> {
IrGetValueImpl(
startOffset, endOffset, type, symbol,
// Note: sometimes we change an IR type of local variable
// (see component call case: Fir2IrDeclarationStorage.createIrVariable -> val type = ...)
// That's why we should use here v the IR variable type and not FIR converted type (to prevent IR inconsistency)
startOffset, endOffset, symbol.owner.type, symbol,
origin = if (variableAsFunctionMode) IrStatementOrigin.VARIABLE_AS_FUNCTION
else calleeReference.statementOrigin()
)
@@ -1,6 +1,5 @@
// WITH_STDLIB
// KT-55458
// IGNORE_BACKEND_K2: NATIVE
val arr = arrayOf("a", "b", "c", "d")
@@ -1,6 +1,5 @@
// WITH_STDLIB
// KT-55458
// IGNORE_BACKEND_K2: NATIVE
val xs = "abcd"
@@ -1,6 +1,5 @@
// WITH_STDLIB
// KT-55458
// IGNORE_BACKEND_K2: NATIVE
val xs = listOf("a", "b", "c", "d")
@@ -1,6 +1,5 @@
// WITH_STDLIB
// KT-55458
// IGNORE_BACKEND_K2: NATIVE
val xs = listOf("a", "b", "c", "d").asSequence()
+1 -1
View File
@@ -11,4 +11,4 @@ FILE fqName:<root> fileName:/kt55458.kt
CALL 'public final fun component1 (): A of kotlin.Pair [operator] declared in kotlin.Pair' type=kotlin.Int origin=COMPONENT_N(index=1)
$this: GET_VAR 'val tmp_0: kotlin.Pair<kotlin.Int, kotlin.Int> [val] declared in <root>.main' type=kotlin.Pair<kotlin.Int, kotlin.Int> origin=null
CALL 'public final fun println (message: kotlin.Any?): kotlin.Unit [inline] declared in kotlin.io.ConsoleKt' type=kotlin.Unit origin=null
message: GET_VAR 'val a: kotlin.Int [val] declared in <root>.main' type=kotlin.Any origin=null
message: GET_VAR 'val a: kotlin.Int [val] declared in <root>.main' type=kotlin.Int origin=null
@@ -142,8 +142,8 @@ FILE fqName:<root> fileName:/enhancedNullabilityInDestructuringAssignment.kt
CALL 'public final fun component2 (): T2 of <root>.Q [operator] declared in <root>.Q' type=@[EnhancedNullability] kotlin.String origin=COMPONENT_N(index=2)
$this: GET_VAR 'val tmp_1: @[FlexibleNullability] <root>.Q<@[EnhancedNullability] kotlin.String, @[EnhancedNullability] kotlin.String>? [val] declared in <root>.test2' type=@[FlexibleNullability] <root>.Q<@[EnhancedNullability] kotlin.String, @[EnhancedNullability] kotlin.String>? origin=null
CALL 'public final fun use (x: kotlin.Any, y: kotlin.Any): kotlin.Unit declared in <root>' type=kotlin.Unit origin=null
x: GET_VAR 'val x: @[EnhancedNullability] kotlin.String [val] declared in <root>.test2' type=kotlin.String origin=null
y: GET_VAR 'val y: @[EnhancedNullability] kotlin.String [val] declared in <root>.test2' type=kotlin.String origin=null
x: GET_VAR 'val x: @[EnhancedNullability] kotlin.String [val] declared in <root>.test2' type=@[EnhancedNullability] kotlin.String origin=null
y: GET_VAR 'val y: @[EnhancedNullability] kotlin.String [val] declared in <root>.test2' type=@[EnhancedNullability] kotlin.String origin=null
FUN name:test2Desugared visibility:public modality:FINAL <> () returnType:kotlin.Unit
BLOCK_BODY
VAR name:tmp type:@[FlexibleNullability] <root>.Q<@[EnhancedNullability] kotlin.String, @[EnhancedNullability] kotlin.String>? [val]
@@ -173,8 +173,8 @@ FILE fqName:<root> fileName:/enhancedNullabilityInDestructuringAssignment.kt
CALL 'public final fun component2 (): T2 of <root>.Q [operator] declared in <root>.Q' type=@[EnhancedNullability] kotlin.String origin=COMPONENT_N(index=2)
$this: GET_VAR 'val tmp_2: <root>.Q<@[EnhancedNullability] kotlin.String, @[EnhancedNullability] kotlin.String> [val] declared in <root>.test3' type=<root>.Q<@[EnhancedNullability] kotlin.String, @[EnhancedNullability] kotlin.String> origin=null
CALL 'public final fun use (x: kotlin.Any, y: kotlin.Any): kotlin.Unit declared in <root>' type=kotlin.Unit origin=null
x: GET_VAR 'val x: @[EnhancedNullability] kotlin.String [val] declared in <root>.test3' type=kotlin.String origin=null
y: GET_VAR 'val y: @[EnhancedNullability] kotlin.String [val] declared in <root>.test3' type=kotlin.String origin=null
x: GET_VAR 'val x: @[EnhancedNullability] kotlin.String [val] declared in <root>.test3' type=@[EnhancedNullability] kotlin.String origin=null
y: GET_VAR 'val y: @[EnhancedNullability] kotlin.String [val] declared in <root>.test3' type=@[EnhancedNullability] kotlin.String origin=null
FUN name:test4 visibility:public modality:FINAL <> () returnType:kotlin.Unit
BLOCK_BODY
VAR IR_TEMPORARY_VARIABLE name:tmp_3 type:kotlin.collections.IndexedValue<@[EnhancedNullability] <root>.P> [val]
@@ -193,4 +193,4 @@ FILE fqName:<root> fileName:/enhancedNullabilityInDestructuringAssignment.kt
$this: GET_VAR 'val tmp_3: kotlin.collections.IndexedValue<@[EnhancedNullability] <root>.P> [val] declared in <root>.test4' type=kotlin.collections.IndexedValue<@[EnhancedNullability] <root>.P> origin=null
CALL 'public final fun use (x: kotlin.Any, y: kotlin.Any): kotlin.Unit declared in <root>' type=kotlin.Unit origin=null
x: GET_VAR 'val x: kotlin.Int [val] declared in <root>.test4' type=kotlin.Int origin=null
y: GET_VAR 'val y: @[EnhancedNullability] <root>.P [val] declared in <root>.test4' type=<root>.P origin=null
y: GET_VAR 'val y: @[EnhancedNullability] <root>.P [val] declared in <root>.test4' type=@[EnhancedNullability] <root>.P origin=null