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.CommonBackendContext
|
||||||
import org.jetbrains.kotlin.backend.common.FileLoweringPass
|
import org.jetbrains.kotlin.backend.common.FileLoweringPass
|
||||||
import org.jetbrains.kotlin.backend.common.lower.*
|
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.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.descriptors.VariableDescriptor
|
import org.jetbrains.kotlin.descriptors.VariableDescriptor
|
||||||
import org.jetbrains.kotlin.ir.IrStatement
|
import org.jetbrains.kotlin.ir.IrStatement
|
||||||
@@ -98,7 +99,7 @@ internal class LateinitLowering(
|
|||||||
val propertyReference = expression.extensionReceiver!! as IrPropertyReference
|
val propertyReference = expression.extensionReceiver!! as IrPropertyReference
|
||||||
assert(propertyReference.extensionReceiver == null, { "'lateinit' modifier is not allowed on extension properties" })
|
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.
|
// 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
|
val type = propertyDescriptor.type
|
||||||
assert(!KotlinBuiltIns.isPrimitiveType(type), { "'lateinit' modifier is not allowed on primitive types" })
|
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"
|
source = "codegen/lateinit/globalIsInitialized.kt"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
task lateinit_innerIsInitialized(type: RunKonanTest) {
|
||||||
|
goldValue = "OK\n"
|
||||||
|
source = "codegen/lateinit/innerIsInitialized.kt"
|
||||||
|
}
|
||||||
|
|
||||||
task kclass0(type: RunKonanTest) {
|
task kclass0(type: RunKonanTest) {
|
||||||
source = "codegen/kclass/kclass0.kt"
|
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