Fixed bug with isInitialized for fake overridden properties + test
This commit is contained in:
+2
-1
@@ -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" })
|
||||
|
||||
@@ -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())
|
||||
}
|
||||
Reference in New Issue
Block a user