Fixed bug in Inliner + test

This commit is contained in:
Igor Chevdar
2018-05-11 13:44:42 +03:00
parent 2b97610301
commit 7ded115ddd
3 changed files with 23 additions and 2 deletions
@@ -35,6 +35,7 @@ import org.jetbrains.kotlin.ir.symbols.impl.createValueSymbol
import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
import org.jetbrains.kotlin.ir.visitors.acceptVoid
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
@@ -60,9 +61,9 @@ internal class DeepCopyIrTreeWithDescriptors(val targetDescriptor: FunctionDescr
fun copy(irElement: IrElement, typeSubstitutor: TypeSubstitutor?): IrElement { fun copy(irElement: IrElement, typeSubstitutor: TypeSubstitutor?): IrElement {
this.typeSubstitutor = typeSubstitutor this.typeSubstitutor = typeSubstitutor
// Create all class descriptors and all necessary descriptors in order to create KotlinTypes. // Create all class descriptors and all necessary descriptors in order to create KotlinTypes.
irElement.acceptChildrenVoid(DescriptorCollectorCreatePhase()) irElement.acceptVoid(DescriptorCollectorCreatePhase())
// Initialize all created descriptors possibly using previously created types. // Initialize all created descriptors possibly using previously created types.
irElement.acceptChildrenVoid(DescriptorCollectorInitPhase()) irElement.acceptVoid(DescriptorCollectorInitPhase())
return irElement.accept(InlineCopyIr(), null) return irElement.accept(InlineCopyIr(), null)
} }
+5
View File
@@ -2326,6 +2326,11 @@ task inline_statementAsLastExprInBlock(type: RunKonanTest) {
source = "codegen/inline/statementAsLastExprInBlock.kt" source = "codegen/inline/statementAsLastExprInBlock.kt"
} }
task inline_returnLocalClassFromBlock(type: RunKonanTest) {
goldValue = "Zzz\n"
source = "codegen/inline/returnLocalClassFromBlock.kt"
}
task deserialized_inline0(type: RunKonanTest) { task deserialized_inline0(type: RunKonanTest) {
source = "serialization/deserialized_inline0.kt" source = "serialization/deserialized_inline0.kt"
} }
@@ -0,0 +1,15 @@
package codegen.inline.returnLocalClassFromBlock
import kotlin.test.*
inline fun <R> call(block: ()->R): R {
try {
return block()
} finally {
println("Zzz")
}
}
@Test fun runTest() {
call { class Z(); Z() }
}