Fixed bug with isInitialized for fake overridden properties + test

This commit is contained in:
Igor Chevdar
2018-03-14 19:17:58 +03:00
parent 819b78bf45
commit f975c1d251
3 changed files with 30 additions and 1 deletions
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.backend.konan.lower
import org.jetbrains.kotlin.backend.common.CommonBackendContext
import org.jetbrains.kotlin.backend.common.FileLoweringPass
import org.jetbrains.kotlin.backend.common.lower.*
import org.jetbrains.kotlin.backend.konan.descriptors.resolveFakeOverride
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.VariableDescriptor
import org.jetbrains.kotlin.ir.IrStatement
@@ -98,7 +99,7 @@ internal class LateinitLowering(
val propertyReference = expression.extensionReceiver!! as IrPropertyReference
assert(propertyReference.extensionReceiver == null, { "'lateinit' modifier is not allowed on extension properties" })
// TODO: Take propertyReference.fieldSymbol as soon as it will show up in IR.
val propertyDescriptor = propertyReference.descriptor
val propertyDescriptor = propertyReference.descriptor.resolveFakeOverride().original
val type = propertyDescriptor.type
assert(!KotlinBuiltIns.isPrimitiveType(type), { "'lateinit' modifier is not allowed on primitive types" })
+5
View File
@@ -1092,6 +1092,11 @@ task lateinit_globalIsInitialized(type: RunKonanTest) {
source = "codegen/lateinit/globalIsInitialized.kt"
}
task lateinit_innerIsInitialized(type: RunKonanTest) {
goldValue = "OK\n"
source = "codegen/lateinit/innerIsInitialized.kt"
}
task kclass0(type: RunKonanTest) {
source = "codegen/kclass/kclass0.kt"
}
@@ -0,0 +1,23 @@
package codegen.lateinit.innerIsInitialized
import kotlin.test.*
open class Foo {
lateinit var bar: String
fun test(): String {
return InnerSubclass().testInner()
}
inner class InnerSubclass : Foo() {
fun testInner(): String {
// This is access to InnerSubclass.bar which is inherited from Foo.bar
if (this::bar.isInitialized) return "Fail"
return "OK"
}
}
}
@Test fun runTest() {
println(Foo().test())
}