IR: fix offsets in irTemporary

The variable generated by IrStatementBuilder.irTemporary doesn't inherit
startOffset and endOffset from the builder. In particular, as a result,
temporary variables generated for elvis operator left operand have
UNDEFINED_OFFSET.

Additionally, ProvisionalFunctionExpressionLowering copies the offsets
of a variable to lowered lambda in the variable initializer. With the
problem described above, this causes invalid debug information in
Kotlin/Native, see KT-49360.

Fix irTemporary by using builder's offsets for the variable.

^KT-49360 Fixed
This commit is contained in:
Svyatoslav Scherbina
2021-11-12 11:45:09 +03:00
committed by Space
parent fb859c0270
commit 2f5706597a
8 changed files with 181 additions and 1 deletions
@@ -45,7 +45,11 @@ fun <T : IrElement> IrStatementsBuilder<T>.irTemporary(
irType: IrType = value?.type!!, // either value or irType should be supplied at callsite
isMutable: Boolean = false,
): IrVariable {
val temporary = scope.createTemporaryVariableDeclaration(irType, nameHint, isMutable)
val temporary = scope.createTemporaryVariableDeclaration(
irType, nameHint, isMutable,
startOffset = startOffset,
endOffset = endOffset
)
value?.let { temporary.initializer = it }
+temporary
return temporary