FIR2IR: don't generate unnecessary 'return throw'

#KT-60245 Fixed
This commit is contained in:
Mikhail Glukhikh
2023-08-18 17:16:46 +02:00
committed by Space Team
parent 90904e4f8a
commit 7d5e2f85cc
8 changed files with 15 additions and 16 deletions
@@ -190,7 +190,7 @@ class Fir2IrImplicitCastInserter(
(data as? IrContainerExpression)?.insertImplicitCasts() ?: data
override fun visitReturnExpression(returnExpression: FirReturnExpression, data: IrElement): IrElement {
val irReturn = data as IrReturn
val irReturn = data as? IrReturn ?: return data
val expectedType = returnExpression.target.labeledElement.returnTypeRef
irReturn.value = irReturn.value.cast(returnExpression.result, returnExpression.result.typeRef, expectedType)
return data
@@ -498,9 +498,13 @@ class Fir2IrVisitor(
// ==================================================================================
override fun visitReturnExpression(returnExpression: FirReturnExpression, data: Any?): IrElement {
val result = returnExpression.result
if (result is FirThrowExpression) {
// Note: in FIR we must have 'return' as the last statement
return convertToIrExpression(result)
}
val irTarget = conversionScope.returnTarget(returnExpression, declarationStorage)
return returnExpression.convertWithOffsets { startOffset, endOffset ->
val result = returnExpression.result
// For implicit returns, use the expression endOffset to generate the expected line number for debugging.
val returnStartOffset = if (returnExpression.source?.kind is KtFakeSourceElementKind.ImplicitReturn) endOffset else startOffset
IrReturnImpl(