diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMemberPropertiesChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMemberPropertiesChecker.kt index 83e21fe3017..be3a58bef2e 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMemberPropertiesChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMemberPropertiesChecker.kt @@ -35,8 +35,8 @@ object FirMemberPropertiesChecker : FirClassChecker() { for (innerDeclaration in declaration.declarations) { if (innerDeclaration is FirProperty) { val symbol = innerDeclaration.symbol - val isInitialized = innerDeclaration.initializer != null || info?.get(symbol)?.isDefinitelyVisited() == true - checkProperty(declaration, innerDeclaration, isInitialized, context, reporter, !reachedDeadEnd) + val isDefinitelyAssignedInConstructor = info?.get(symbol)?.isDefinitelyVisited() == true + checkProperty(declaration, innerDeclaration, isDefinitelyAssignedInConstructor, context, reporter, !reachedDeadEnd) } // Can't just look at each property's graph's enterNode because they may have no graph if there is no initializer. reachedDeadEnd = reachedDeadEnd || @@ -59,7 +59,7 @@ object FirMemberPropertiesChecker : FirClassChecker() { private fun checkProperty( containingDeclaration: FirClass, property: FirProperty, - isInitialized: Boolean, + isDefinitelyAssignedInConstructor: Boolean, context: CheckerContext, reporter: DiagnosticReporter, reachable: Boolean @@ -74,7 +74,7 @@ object FirMemberPropertiesChecker : FirClassChecker() { containingDeclaration, property, modifierList, - isInitialized, + isDefinitelyAssignedInConstructor, reporter, context, reachable diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTopLevelPropertiesChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTopLevelPropertiesChecker.kt index 7a249920404..681f31a109c 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTopLevelPropertiesChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTopLevelPropertiesChecker.kt @@ -8,6 +8,8 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.config.LanguageFeature +import org.jetbrains.kotlin.config.LanguageVersionSettings +import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.diagnostics.reportOn @@ -42,7 +44,7 @@ object FirTopLevelPropertiesChecker : FirPropertyChecker() { containingClass = null, declaration, modifierList, - isInitialized = declaration.initializer != null, + isDefinitelyAssignedInConstructor = false, // Only member properties can be assigned in constructors reporter, context ) @@ -72,7 +74,7 @@ internal fun checkPropertyInitializer( containingClass: FirClass?, property: FirProperty, modifierList: FirModifierList?, - isInitialized: Boolean, + isDefinitelyAssignedInConstructor: Boolean, reporter: DiagnosticReporter, context: CheckerContext, reachable: Boolean = true @@ -94,7 +96,7 @@ internal fun checkPropertyInitializer( } val backingFieldRequired = property.hasBackingField - if (inInterface && backingFieldRequired && property.hasAccessorImplementation) { + if (inInterface && backingFieldRequired && property.hasAnyAccessorImplementation) { property.source?.let { reporter.reportOn(it, FirErrors.BACKING_FIELD_IN_INTERFACE, context) } @@ -136,19 +138,22 @@ internal fun checkPropertyInitializer( else -> { val propertySource = property.source ?: return val isExternal = property.isEffectivelyExternal(containingClass, context) + val isCorrectlyInitialized = + property.initializer != null || isDefinitelyAssignedInConstructor && !property.hasSetterAccessorImplementation && + property.getEffectiveModality(containingClass, context.languageVersionSettings) != Modality.OPEN if ( backingFieldRequired && !inInterface && !property.isLateInit && !isExpect && - !isInitialized && + !isCorrectlyInitialized && !isExternal && !property.hasExplicitBackingField ) { - if (property.receiverParameter != null && !property.hasAccessorImplementation) { + if (property.receiverParameter != null && !property.hasAnyAccessorImplementation) { reporter.reportOn(propertySource, FirErrors.EXTENSION_PROPERTY_MUST_HAVE_ACCESSORS_OR_BE_ABSTRACT, context) } else if (reachable) { // TODO: can be suppressed not to report diagnostics about no body - if (containingClass == null || property.hasAccessorImplementation) { + if (containingClass == null || property.hasAnyAccessorImplementation) { reporter.reportOn(propertySource, FirErrors.MUST_BE_INITIALIZED, context) } else { reporter.reportOn(propertySource, FirErrors.MUST_BE_INITIALIZED_OR_BE_ABSTRACT, context) @@ -160,7 +165,7 @@ internal fun checkPropertyInitializer( reporter.reportOn(propertySource, FirErrors.EXPECTED_LATEINIT_PROPERTY, context) } // TODO: like [BindingContext.MUST_BE_LATEINIT], we should consider variable with uninitialized error. - if (backingFieldRequired && !inInterface && isInitialized) { + if (backingFieldRequired && !inInterface && isCorrectlyInitialized) { if (context.languageVersionSettings.supportsFeature(LanguageFeature.EnableDfaWarningsInK2)) { reporter.reportOn(propertySource, FirErrors.UNNECESSARY_LATEINIT, context) } @@ -170,6 +175,16 @@ internal fun checkPropertyInitializer( } } -private val FirProperty.hasAccessorImplementation: Boolean - get() = (getter !is FirDefaultPropertyAccessor && getter?.hasBody == true) || - (setter !is FirDefaultPropertyAccessor && setter?.hasBody == true) +private val FirPropertyAccessor?.hasImplementation: Boolean + get() = (this !is FirDefaultPropertyAccessor && this?.hasBody == true) +private val FirProperty.hasSetterAccessorImplementation: Boolean + get() = setter.hasImplementation +private val FirProperty.hasAnyAccessorImplementation: Boolean + get() = getter.hasImplementation || setter.hasImplementation + +private fun FirProperty.getEffectiveModality(containingClass: FirClass?, languageVersionSettings: LanguageVersionSettings): Modality? = + when (languageVersionSettings.supportsFeature(LanguageFeature.TakeIntoAccountEffectivelyFinalInMustBeInitializedCheck) && + status.modality == Modality.OPEN && containingClass?.status?.modality == Modality.FINAL) { + true -> Modality.FINAL + false -> status.modality + } diff --git a/compiler/testData/diagnostics/tests/backingField/InitCustomSetter.fir.kt b/compiler/testData/diagnostics/tests/backingField/InitCustomSetter.fir.kt deleted file mode 100644 index c39035d89e1..00000000000 --- a/compiler/testData/diagnostics/tests/backingField/InitCustomSetter.fir.kt +++ /dev/null @@ -1,30 +0,0 @@ -class My(val v: Int) { - // Ok: setter is just private - var x: Int - private set - - var y: Int - set(arg) { field = arg } - - var z: Int - set(arg) { field = arg } - - // Ok: initializer available - var w: Int = v - set(arg) { field = arg } - - // Ok: no backing field - var u: Int - get() = w - set(arg) { w = 2 * arg } - - constructor(): this(0) { - z = v - } - - init { - x = 1 - y = 2 - u = 3 - } -} diff --git a/compiler/testData/diagnostics/tests/backingField/InitCustomSetter.kt b/compiler/testData/diagnostics/tests/backingField/InitCustomSetter.kt index 11c04fa4808..da4d28593ba 100644 --- a/compiler/testData/diagnostics/tests/backingField/InitCustomSetter.kt +++ b/compiler/testData/diagnostics/tests/backingField/InitCustomSetter.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL class My(val v: Int) { // Ok: setter is just private var x: Int diff --git a/compiler/testData/diagnostics/tests/backingField/InitOpenSetter.fir.kt b/compiler/testData/diagnostics/tests/backingField/InitOpenSetter.fir.kt index bbc5ecea2c8..95947d2bc09 100644 --- a/compiler/testData/diagnostics/tests/backingField/InitOpenSetter.fir.kt +++ b/compiler/testData/diagnostics/tests/backingField/InitOpenSetter.fir.kt @@ -2,7 +2,7 @@ abstract class My(val v: Int) { // Ok: variable is just abstract abstract var x: Int - open var y: Int + open var y: Int open var z: Int diff --git a/compiler/testData/diagnostics/tests/backingField/MustBeInitializedEffectivelyFinalOff.fir.kt b/compiler/testData/diagnostics/tests/backingField/MustBeInitializedEffectivelyFinalOff.fir.kt deleted file mode 100644 index c55f56e88d5..00000000000 --- a/compiler/testData/diagnostics/tests/backingField/MustBeInitializedEffectivelyFinalOff.fir.kt +++ /dev/null @@ -1,12 +0,0 @@ -// !LANGUAGE:-TakeIntoAccountEffectivelyFinalInMustBeInitializedCheck -open class Base { - open var x: String = "" -} - -class Foo : Base() { - override var x: String - - init { - x = "" - } -} diff --git a/compiler/testData/diagnostics/tests/backingField/MustBeInitializedEffectivelyFinalOff.kt b/compiler/testData/diagnostics/tests/backingField/MustBeInitializedEffectivelyFinalOff.kt index 1e91d1fa62f..19441d7af92 100644 --- a/compiler/testData/diagnostics/tests/backingField/MustBeInitializedEffectivelyFinalOff.kt +++ b/compiler/testData/diagnostics/tests/backingField/MustBeInitializedEffectivelyFinalOff.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !LANGUAGE:-TakeIntoAccountEffectivelyFinalInMustBeInitializedCheck open class Base { open var x: String = "" diff --git a/compiler/testData/diagnostics/tests/backingField/ValDeferredInitInOpenClass.fir.kt b/compiler/testData/diagnostics/tests/backingField/ValDeferredInitInOpenClass.fir.kt new file mode 100644 index 00000000000..9e7fd4dbd3c --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/ValDeferredInitInOpenClass.fir.kt @@ -0,0 +1,53 @@ +// !DIAGNOSTICS: -DEBUG_INFO_LEAKING_THIS +// a = final + not initialized in place + deferred init +// e = final + not initialized in place +// c = final + initialized in place + +// b = open + not initialized in place + deferred init +// f = open + not initialized in place +// d = open + initialized in place +open class Foo { + // no getter + val a0: Int + val e0: Int + val c0: Int = 1 + open val b0: Int + open val f0: Int + open val d0: Int = 1 + + // getter with field + val a1: Int; get() = field + val e1: Int; get() = field + val c1: Int = 1; get() = field + open val b1: Int; get() = field + open val f1: Int; get() = field + open val d1: Int = 1; get() = field + + // getter with empty body + val a2: Int; get + val e2: Int; get + val c2: Int = 1; get + open val b2: Int; get + open val f2: Int; get + open val d2: Int = 1; get + + // getter no field + val a3: Int; get() = 1 + val e3: Int; get() = 1 + val c3: Int = 1; get() = 1 + open val b3: Int; get() = 1 + open val f3: Int; get() = 1 + open val d3: Int = 1; get() = 1 + + init { + a0 = 1 + a1 = 1 + a2 = 1 + a3 = 1 + + b0 = 1 + b1 = 1 + b2 = 1 + b3 = 1 + } +} diff --git a/compiler/testData/diagnostics/tests/backingField/ValDeferredInitInOpenClass.kt b/compiler/testData/diagnostics/tests/backingField/ValDeferredInitInOpenClass.kt index 8f9f97584cd..b61479b8ac2 100644 --- a/compiler/testData/diagnostics/tests/backingField/ValDeferredInitInOpenClass.kt +++ b/compiler/testData/diagnostics/tests/backingField/ValDeferredInitInOpenClass.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL // !DIAGNOSTICS: -DEBUG_INFO_LEAKING_THIS // a = final + not initialized in place + deferred init // e = final + not initialized in place diff --git a/compiler/testData/diagnostics/tests/backingField/VarDeferredInitInFinalClass.fir.kt b/compiler/testData/diagnostics/tests/backingField/VarDeferredInitInFinalClass.fir.kt deleted file mode 100644 index eb824c23372..00000000000 --- a/compiler/testData/diagnostics/tests/backingField/VarDeferredInitInFinalClass.fir.kt +++ /dev/null @@ -1,128 +0,0 @@ -// !DIAGNOSTICS: -DEBUG_INFO_LEAKING_THIS -// a = final + not initialized in place + deferred init -// e = final + not initialized in place -// c = final + initialized in place - -// b = open + not initialized in place + deferred init -// f = open + not initialized in place -// d = open + initialized in place -class Foo : I { - // no setter; setter with field; setter with empty body; setter no field; - // no getter - var a00: Int; var a01: Int; set(v) { field = v }; var a02: Int; set; var a03: Int; set(v) {}; - var e00: Int; var e01: Int; set(v) { field = v }; var e02: Int; set; var e03: Int; set(v) {}; - var c00: Int = 1; var c01: Int = 1; set(v) { field = v }; var c02: Int = 1; set; var c03: Int = 1; set(v) {}; - override var b00: Int; override var b01: Int; set(v) { field = v }; override var b02: Int; set; override var b03: Int; set(v) {}; - override var f00: Int; override var f01: Int; set(v) { field = v }; override var f02: Int; set; override var f03: Int; set(v) {}; - override var d00: Int = 1; override var d01: Int = 1; set(v) { field = v }; override var d02: Int = 1; set; override var d03: Int = 1; set(v) {}; - // getter with field - var a10: Int; get() = field; var a11: Int; set(v) { field = v } get() = field; var a12: Int; set get() = field; var a13: Int; set(v) {} get() = field; - var e10: Int; get() = field; var e11: Int; set(v) { field = v } get() = field; var e12: Int; set get() = field; var e13: Int; set(v) {} get() = field; - var c10: Int = 1; get() = field; var c11: Int = 1; set(v) { field = v } get() = field; var c12: Int = 1; set get() = field; var c13: Int = 1; set(v) {} get() = field; - override var b10: Int; get() = field; override var b11: Int; set(v) { field = v } get() = field; override var b12: Int; set get() = field; override var b13: Int; set(v) {} get() = field; - override var f10: Int; get() = field; override var f11: Int; set(v) { field = v } get() = field; override var f12: Int; set get() = field; override var f13: Int; set(v) {} get() = field; - override var d10: Int = 1; get() = field; override var d11: Int = 1; set(v) { field = v } get() = field; override var d12: Int = 1; set get() = field; override var d13: Int = 1; set(v) {} get() = field; - // getter with empty body - var a20: Int; get; var a21: Int; set(v) { field = v } get; var a22: Int; set get; var a23: Int; set(v) {} get; - var e20: Int; get; var e21: Int; set(v) { field = v } get; var e22: Int; set get; var e23: Int; set(v) {} get; - var c20: Int = 1; get; var c21: Int = 1; set(v) { field = v } get; var c22: Int = 1; set get; var c23: Int = 1; set(v) {} get; - override var b20: Int; get; override var b21: Int; set(v) { field = v } get; override var b22: Int; set get; override var b23: Int; set(v) {} get; - override var f20: Int; get; override var f21: Int; set(v) { field = v } get; override var f22: Int; set get; override var f23: Int; set(v) {} get; - override var d20: Int = 1; get; override var d21: Int = 1; set(v) { field = v } get; override var d22: Int = 1; set get; override var d23: Int = 1; set(v) {} get; - // getter no field - var a30: Int; get() = 1; var a31: Int; set(v) { field = v } get() = 1; var a32: Int; set get() = 1; var a33: Int; set(v) {} get() = 1; - var e30: Int; get() = 1; var e31: Int; set(v) { field = v } get() = 1; var e32: Int; set get() = 1; var e33: Int; set(v) {} get() = 1; - var c30: Int = 1; get() = 1; var c31: Int = 1; set(v) { field = v } get() = 1; var c32: Int = 1; set get() = 1; var c33: Int = 1; set(v) {} get() = 1; - override var b30: Int; get() = 1; override var b31: Int; set(v) { field = v } get() = 1; override var b32: Int; set get() = 1; override var b33: Int; set(v) {} get() = 1; - override var f30: Int; get() = 1; override var f31: Int; set(v) { field = v } get() = 1; override var f32: Int; set get() = 1; override var f33: Int; set(v) {} get() = 1; - override var d30: Int = 1; get() = 1; override var d31: Int = 1; set(v) { field = v } get() = 1; override var d32: Int = 1; set get() = 1; override var d33: Int = 1; set(v) {} get() = 1; - - init { - a00 = 1 - a01 = 1 - a02 = 1 - a03 = 1 - a10 = 1 - a11 = 1 - a12 = 1 - a13 = 1 - a20 = 1 - a21 = 1 - a22 = 1 - a23 = 1 - a30 = 1 - a31 = 1 - a32 = 1 - a33 = 1 - - b00 = 1 - b01 = 1 - b02 = 1 - b03 = 1 - b10 = 1 - b11 = 1 - b12 = 1 - b13 = 1 - b20 = 1 - b21 = 1 - b22 = 1 - b23 = 1 - b30 = 1 - b31 = 1 - b32 = 1 - b33 = 1 - } -} - -interface I { - val b00: Int - val b01: Int - val b02: Int - val b03: Int - val b10: Int - val b11: Int - val b12: Int - val b13: Int - val b20: Int - val b21: Int - val b22: Int - val b23: Int - val b30: Int - val b31: Int - val b32: Int - val b33: Int - - val f00: Int - val f01: Int - val f02: Int - val f03: Int - val f10: Int - val f11: Int - val f12: Int - val f13: Int - val f20: Int - val f21: Int - val f22: Int - val f23: Int - val f30: Int - val f31: Int - val f32: Int - val f33: Int - - val d00: Int - val d01: Int - val d02: Int - val d03: Int - val d10: Int - val d11: Int - val d12: Int - val d13: Int - val d20: Int - val d21: Int - val d22: Int - val d23: Int - val d30: Int - val d31: Int - val d32: Int - val d33: Int -} diff --git a/compiler/testData/diagnostics/tests/backingField/VarDeferredInitInFinalClass.kt b/compiler/testData/diagnostics/tests/backingField/VarDeferredInitInFinalClass.kt index 6e46487da8f..e33697f8fef 100644 --- a/compiler/testData/diagnostics/tests/backingField/VarDeferredInitInFinalClass.kt +++ b/compiler/testData/diagnostics/tests/backingField/VarDeferredInitInFinalClass.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -DEBUG_INFO_LEAKING_THIS // a = final + not initialized in place + deferred init // e = final + not initialized in place diff --git a/compiler/testData/diagnostics/tests/backingField/VarDeferredInitInOpenClass.fir.kt b/compiler/testData/diagnostics/tests/backingField/VarDeferredInitInOpenClass.fir.kt deleted file mode 100644 index ae6bdeb9ed1..00000000000 --- a/compiler/testData/diagnostics/tests/backingField/VarDeferredInitInOpenClass.fir.kt +++ /dev/null @@ -1,75 +0,0 @@ -// !DIAGNOSTICS: -DEBUG_INFO_LEAKING_THIS -// a = final + not initialized in place + deferred init -// e = final + not initialized in place -// c = final + initialized in place - -// b = open + not initialized in place + deferred init -// f = open + not initialized in place -// d = open + initialized in place -open class Foo { - // no setter; setter with field; setter with empty body; setter no field; - // no getter - var a00: Int; var a01: Int; set(v) { field = v }; var a02: Int; set; var a03: Int; set(v) {}; - var e00: Int; var e01: Int; set(v) { field = v }; var e02: Int; set; var e03: Int; set(v) {}; - var c00: Int = 1; var c01: Int = 1; set(v) { field = v }; var c02: Int = 1; set; var c03: Int = 1; set(v) {}; - open var b00: Int; open var b01: Int; set(v) { field = v }; open var b02: Int; set; open var b03: Int; set(v) {}; - open var f00: Int; open var f01: Int; set(v) { field = v }; open var f02: Int; set; open var f03: Int; set(v) {}; - open var d00: Int = 1; open var d01: Int = 1; set(v) { field = v }; open var d02: Int = 1; set; open var d03: Int = 1; set(v) {}; - // getter with field - var a10: Int; get() = field; var a11: Int; set(v) { field = v } get() = field; var a12: Int; set get() = field; var a13: Int; set(v) {} get() = field; - var e10: Int; get() = field; var e11: Int; set(v) { field = v } get() = field; var e12: Int; set get() = field; var e13: Int; set(v) {} get() = field; - var c10: Int = 1; get() = field; var c11: Int = 1; set(v) { field = v } get() = field; var c12: Int = 1; set get() = field; var c13: Int = 1; set(v) {} get() = field; - open var b10: Int; get() = field; open var b11: Int; set(v) { field = v } get() = field; open var b12: Int; set get() = field; open var b13: Int; set(v) {} get() = field; - open var f10: Int; get() = field; open var f11: Int; set(v) { field = v } get() = field; open var f12: Int; set get() = field; open var f13: Int; set(v) {} get() = field; - open var d10: Int = 1; get() = field; open var d11: Int = 1; set(v) { field = v } get() = field; open var d12: Int = 1; set get() = field; open var d13: Int = 1; set(v) {} get() = field; - // getter with empty body - var a20: Int; get; var a21: Int; set(v) { field = v } get; var a22: Int; set get; var a23: Int; set(v) {} get; - var e20: Int; get; var e21: Int; set(v) { field = v } get; var e22: Int; set get; var e23: Int; set(v) {} get; - var c20: Int = 1; get; var c21: Int = 1; set(v) { field = v } get; var c22: Int = 1; set get; var c23: Int = 1; set(v) {} get; - open var b20: Int; get; open var b21: Int; set(v) { field = v } get; open var b22: Int; set get; open var b23: Int; set(v) {} get; - open var f20: Int; get; open var f21: Int; set(v) { field = v } get; open var f22: Int; set get; open var f23: Int; set(v) {} get; - open var d20: Int = 1; get; open var d21: Int = 1; set(v) { field = v } get; open var d22: Int = 1; set get; open var d23: Int = 1; set(v) {} get; - // getter no field - var a30: Int; get() = 1; var a31: Int; set(v) { field = v } get() = 1; var a32: Int; set get() = 1; var a33: Int; set(v) {} get() = 1; - var e30: Int; get() = 1; var e31: Int; set(v) { field = v } get() = 1; var e32: Int; set get() = 1; var e33: Int; set(v) {} get() = 1; - var c30: Int = 1; get() = 1; var c31: Int = 1; set(v) { field = v } get() = 1; var c32: Int = 1; set get() = 1; var c33: Int = 1; set(v) {} get() = 1; - open var b30: Int; get() = 1; open var b31: Int; set(v) { field = v } get() = 1; open var b32: Int; set get() = 1; open var b33: Int; set(v) {} get() = 1; - open var f30: Int; get() = 1; open var f31: Int; set(v) { field = v } get() = 1; open var f32: Int; set get() = 1; open var f33: Int; set(v) {} get() = 1; - open var d30: Int = 1; get() = 1; open var d31: Int = 1; set(v) { field = v } get() = 1; open var d32: Int = 1; set get() = 1; open var d33: Int = 1; set(v) {} get() = 1; - - init { - a00 = 1 - a01 = 1 - a02 = 1 - a03 = 1 - a10 = 1 - a11 = 1 - a12 = 1 - a13 = 1 - a20 = 1 - a21 = 1 - a22 = 1 - a23 = 1 - a30 = 1 - a31 = 1 - a32 = 1 - a33 = 1 - - b00 = 1 - b01 = 1 - b02 = 1 - b03 = 1 - b10 = 1 - b11 = 1 - b12 = 1 - b13 = 1 - b20 = 1 - b21 = 1 - b22 = 1 - b23 = 1 - b30 = 1 - b31 = 1 - b32 = 1 - b33 = 1 - } -} diff --git a/compiler/testData/diagnostics/tests/backingField/VarDeferredInitInOpenClass.kt b/compiler/testData/diagnostics/tests/backingField/VarDeferredInitInOpenClass.kt index 4ebc0e5146b..1ad40793d72 100644 --- a/compiler/testData/diagnostics/tests/backingField/VarDeferredInitInOpenClass.kt +++ b/compiler/testData/diagnostics/tests/backingField/VarDeferredInitInOpenClass.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -DEBUG_INFO_LEAKING_THIS // a = final + not initialized in place + deferred init // e = final + not initialized in place diff --git a/compiler/testData/ir/irText/classes/initVar.ir.txt b/compiler/testData/ir/irText/classes/initVar.ir.txt index aa0c276fc78..8bf126452c2 100644 --- a/compiler/testData/ir/irText/classes/initVar.ir.txt +++ b/compiler/testData/ir/irText/classes/initVar.ir.txt @@ -155,83 +155,3 @@ FILE fqName: fileName:/initVar.kt overridden: public open fun toString (): kotlin.String declared in kotlin.Any $this: VALUE_PARAMETER name: type:kotlin.Any - CLASS CLASS name:TestInitVarWithCustomSetterWithExplicitCtor modality:FINAL visibility:public superTypes:[kotlin.Any] - $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.TestInitVarWithCustomSetterWithExplicitCtor - PROPERTY name:x visibility:public modality:FINAL [var] - FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private - FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:.TestInitVarWithCustomSetterWithExplicitCtor) returnType:kotlin.Int - correspondingProperty: PROPERTY name:x visibility:public modality:FINAL [var] - $this: VALUE_PARAMETER name: type:.TestInitVarWithCustomSetterWithExplicitCtor - BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun (): kotlin.Int declared in .TestInitVarWithCustomSetterWithExplicitCtor' - GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private' type=kotlin.Int origin=null - receiver: GET_VAR ': .TestInitVarWithCustomSetterWithExplicitCtor declared in .TestInitVarWithCustomSetterWithExplicitCtor.' type=.TestInitVarWithCustomSetterWithExplicitCtor origin=null - FUN name: visibility:public modality:FINAL <> ($this:.TestInitVarWithCustomSetterWithExplicitCtor, value:kotlin.Int) returnType:kotlin.Unit - correspondingProperty: PROPERTY name:x visibility:public modality:FINAL [var] - $this: VALUE_PARAMETER name: type:.TestInitVarWithCustomSetterWithExplicitCtor - VALUE_PARAMETER name:value index:0 type:kotlin.Int - BLOCK_BODY - SET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private' type=kotlin.Unit origin=EQ - receiver: GET_VAR ': .TestInitVarWithCustomSetterWithExplicitCtor declared in .TestInitVarWithCustomSetterWithExplicitCtor.' type=.TestInitVarWithCustomSetterWithExplicitCtor origin=null - value: GET_VAR 'value: kotlin.Int declared in .TestInitVarWithCustomSetterWithExplicitCtor.' type=kotlin.Int origin=null - ANONYMOUS_INITIALIZER isStatic=false - BLOCK_BODY - CALL 'public final fun (value: kotlin.Int): kotlin.Unit declared in .TestInitVarWithCustomSetterWithExplicitCtor' type=kotlin.Unit origin=EQ - $this: GET_VAR ': .TestInitVarWithCustomSetterWithExplicitCtor declared in .TestInitVarWithCustomSetterWithExplicitCtor' type=.TestInitVarWithCustomSetterWithExplicitCtor origin=null - value: CONST Int type=kotlin.Int value=0 - CONSTRUCTOR visibility:public <> () returnType:.TestInitVarWithCustomSetterWithExplicitCtor - BLOCK_BODY - DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' - INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:TestInitVarWithCustomSetterWithExplicitCtor modality:FINAL visibility:public superTypes:[kotlin.Any]' - FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] - overridden: - public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any - $this: VALUE_PARAMETER name: type:kotlin.Any - VALUE_PARAMETER name:other index:0 type:kotlin.Any? - FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] - overridden: - public open fun hashCode (): kotlin.Int declared in kotlin.Any - $this: VALUE_PARAMETER name: type:kotlin.Any - FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] - overridden: - public open fun toString (): kotlin.String declared in kotlin.Any - $this: VALUE_PARAMETER name: type:kotlin.Any - CLASS CLASS name:TestInitVarWithCustomSetterInCtor modality:FINAL visibility:public superTypes:[kotlin.Any] - $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.TestInitVarWithCustomSetterInCtor - PROPERTY name:x visibility:public modality:FINAL [var] - FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private - FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:.TestInitVarWithCustomSetterInCtor) returnType:kotlin.Int - correspondingProperty: PROPERTY name:x visibility:public modality:FINAL [var] - $this: VALUE_PARAMETER name: type:.TestInitVarWithCustomSetterInCtor - BLOCK_BODY - RETURN type=kotlin.Nothing from='public final fun (): kotlin.Int declared in .TestInitVarWithCustomSetterInCtor' - GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private' type=kotlin.Int origin=null - receiver: GET_VAR ': .TestInitVarWithCustomSetterInCtor declared in .TestInitVarWithCustomSetterInCtor.' type=.TestInitVarWithCustomSetterInCtor origin=null - FUN name: visibility:public modality:FINAL <> ($this:.TestInitVarWithCustomSetterInCtor, value:kotlin.Int) returnType:kotlin.Unit - correspondingProperty: PROPERTY name:x visibility:public modality:FINAL [var] - $this: VALUE_PARAMETER name: type:.TestInitVarWithCustomSetterInCtor - VALUE_PARAMETER name:value index:0 type:kotlin.Int - BLOCK_BODY - SET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:x type:kotlin.Int visibility:private' type=kotlin.Unit origin=EQ - receiver: GET_VAR ': .TestInitVarWithCustomSetterInCtor declared in .TestInitVarWithCustomSetterInCtor.' type=.TestInitVarWithCustomSetterInCtor origin=null - value: GET_VAR 'value: kotlin.Int declared in .TestInitVarWithCustomSetterInCtor.' type=kotlin.Int origin=null - CONSTRUCTOR visibility:public <> () returnType:.TestInitVarWithCustomSetterInCtor - BLOCK_BODY - DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' - INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:TestInitVarWithCustomSetterInCtor modality:FINAL visibility:public superTypes:[kotlin.Any]' - CALL 'public final fun (value: kotlin.Int): kotlin.Unit declared in .TestInitVarWithCustomSetterInCtor' type=kotlin.Unit origin=EQ - $this: GET_VAR ': .TestInitVarWithCustomSetterInCtor declared in .TestInitVarWithCustomSetterInCtor' type=.TestInitVarWithCustomSetterInCtor origin=null - value: CONST Int type=kotlin.Int value=42 - FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] - overridden: - public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any - $this: VALUE_PARAMETER name: type:kotlin.Any - VALUE_PARAMETER name:other index:0 type:kotlin.Any? - FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] - overridden: - public open fun hashCode (): kotlin.Int declared in kotlin.Any - $this: VALUE_PARAMETER name: type:kotlin.Any - FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] - overridden: - public open fun toString (): kotlin.String declared in kotlin.Any - $this: VALUE_PARAMETER name: type:kotlin.Any diff --git a/compiler/testData/ir/irText/classes/initVar.kt b/compiler/testData/ir/irText/classes/initVar.kt index 64ee9e72caa..cbe62310add 100644 --- a/compiler/testData/ir/irText/classes/initVar.kt +++ b/compiler/testData/ir/irText/classes/initVar.kt @@ -16,24 +16,3 @@ class TestInitVarWithCustomSetter { var x = 0 set(value) { field = value } } - -class TestInitVarWithCustomSetterWithExplicitCtor { - var x: Int - set(value) { field = value } - - init { - x = 0 - } - - constructor() -} - -class TestInitVarWithCustomSetterInCtor { - var x: Int set(value) { - field = value - } - - constructor() { - x = 42 - } -} \ No newline at end of file diff --git a/compiler/testData/ir/irText/classes/initVar.kt.txt b/compiler/testData/ir/irText/classes/initVar.kt.txt index 9572f405988..07babeb4243 100644 --- a/compiler/testData/ir/irText/classes/initVar.kt.txt +++ b/compiler/testData/ir/irText/classes/initVar.kt.txt @@ -59,37 +59,3 @@ class TestInitVarWithCustomSetter { } -class TestInitVarWithCustomSetterWithExplicitCtor { - var x: Int - get - set(value: Int) { - .#x = value - } - - init { - .(value = 0) - } - - constructor() { - super/*Any*/() - /* () */ - - } - -} - -class TestInitVarWithCustomSetterInCtor { - var x: Int - get - set(value: Int) { - .#x = value - } - - constructor() { - super/*Any*/() - /* () */ - - .(value = 42) - } - -} diff --git a/compiler/testData/ir/irText/classes/initVar.sig.kt.txt b/compiler/testData/ir/irText/classes/initVar.sig.kt.txt index eb68ac0122b..b86e8c7a67d 100644 --- a/compiler/testData/ir/irText/classes/initVar.sig.kt.txt +++ b/compiler/testData/ir/irText/classes/initVar.sig.kt.txt @@ -106,57 +106,3 @@ class TestInitVarWithCustomSetter { } -// CHECK: -// Mangled name: TestInitVarWithCustomSetterInCtor -// Public signature: /TestInitVarWithCustomSetterInCtor|null[0] -class TestInitVarWithCustomSetterInCtor { - // CHECK: - // Mangled name: TestInitVarWithCustomSetterInCtor{}x - // Public signature: /TestInitVarWithCustomSetterInCtor.x|-8060530855978347579[0] - var x: Int - // CHECK JVM_IR: - // Mangled name: TestInitVarWithCustomSetterInCtor#(){}kotlin.Int - // Public signature: /TestInitVarWithCustomSetterInCtor.x.|4966956098150895696[0] - // CHECK JS_IR NATIVE: - // Mangled name: TestInitVarWithCustomSetterInCtor#(){} - // Public signature: /TestInitVarWithCustomSetterInCtor.x.|1482705010654679335[0] - get - // CHECK: - // Mangled name: TestInitVarWithCustomSetterInCtor#(kotlin.Int){} - // Public signature: /TestInitVarWithCustomSetterInCtor.x.|-740209739415615559[0] - set(value: Int): Unit - - // CHECK: - // Mangled name: TestInitVarWithCustomSetterInCtor#(){} - // Public signature: /TestInitVarWithCustomSetterInCtor.|-5645683436151566731[0] - constructor() - -} - -// CHECK: -// Mangled name: TestInitVarWithCustomSetterWithExplicitCtor -// Public signature: /TestInitVarWithCustomSetterWithExplicitCtor|null[0] -class TestInitVarWithCustomSetterWithExplicitCtor { - // CHECK: - // Mangled name: TestInitVarWithCustomSetterWithExplicitCtor{}x - // Public signature: /TestInitVarWithCustomSetterWithExplicitCtor.x|-8060530855978347579[0] - var x: Int - // CHECK JVM_IR: - // Mangled name: TestInitVarWithCustomSetterWithExplicitCtor#(){}kotlin.Int - // Public signature: /TestInitVarWithCustomSetterWithExplicitCtor.x.|4966956098150895696[0] - // CHECK JS_IR NATIVE: - // Mangled name: TestInitVarWithCustomSetterWithExplicitCtor#(){} - // Public signature: /TestInitVarWithCustomSetterWithExplicitCtor.x.|1482705010654679335[0] - get - // CHECK: - // Mangled name: TestInitVarWithCustomSetterWithExplicitCtor#(kotlin.Int){} - // Public signature: /TestInitVarWithCustomSetterWithExplicitCtor.x.|-740209739415615559[0] - set(value: Int): Unit - - // CHECK: - // Mangled name: TestInitVarWithCustomSetterWithExplicitCtor#(){} - // Public signature: /TestInitVarWithCustomSetterWithExplicitCtor.|-5645683436151566731[0] - constructor() - -} -