diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index e5ca658fb94..5e08b10d9a5 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -2989,6 +2989,30 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia public void testSetterWithExplicitType() throws Exception { runTest("compiler/testData/diagnostics/tests/backingField/SetterWithExplicitType.kt"); } + + @Test + @TestMetadata("ValDeferredInitInFinalClass.kt") + public void testValDeferredInitInFinalClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/ValDeferredInitInFinalClass.kt"); + } + + @Test + @TestMetadata("ValDeferredInitInOpenClass.kt") + public void testValDeferredInitInOpenClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/ValDeferredInitInOpenClass.kt"); + } + + @Test + @TestMetadata("VarDeferredInitInFinalClass.kt") + public void testVarDeferredInitInFinalClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/VarDeferredInitInFinalClass.kt"); + } + + @Test + @TestMetadata("VarDeferredInitInOpenClass.kt") + public void testVarDeferredInitInOpenClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/VarDeferredInitInOpenClass.kt"); + } } @Nested diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index 5426ff4e32f..772eab68b28 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -2989,6 +2989,30 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated public void testSetterWithExplicitType() throws Exception { runTest("compiler/testData/diagnostics/tests/backingField/SetterWithExplicitType.kt"); } + + @Test + @TestMetadata("ValDeferredInitInFinalClass.kt") + public void testValDeferredInitInFinalClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/ValDeferredInitInFinalClass.kt"); + } + + @Test + @TestMetadata("ValDeferredInitInOpenClass.kt") + public void testValDeferredInitInOpenClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/ValDeferredInitInOpenClass.kt"); + } + + @Test + @TestMetadata("VarDeferredInitInFinalClass.kt") + public void testVarDeferredInitInFinalClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/VarDeferredInitInFinalClass.kt"); + } + + @Test + @TestMetadata("VarDeferredInitInOpenClass.kt") + public void testVarDeferredInitInOpenClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/VarDeferredInitInOpenClass.kt"); + } } @Nested diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java index 10d56dc70f3..0eacad30423 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java @@ -2989,6 +2989,30 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir public void testSetterWithExplicitType() throws Exception { runTest("compiler/testData/diagnostics/tests/backingField/SetterWithExplicitType.kt"); } + + @Test + @TestMetadata("ValDeferredInitInFinalClass.kt") + public void testValDeferredInitInFinalClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/ValDeferredInitInFinalClass.kt"); + } + + @Test + @TestMetadata("ValDeferredInitInOpenClass.kt") + public void testValDeferredInitInOpenClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/ValDeferredInitInOpenClass.kt"); + } + + @Test + @TestMetadata("VarDeferredInitInFinalClass.kt") + public void testVarDeferredInitInFinalClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/VarDeferredInitInFinalClass.kt"); + } + + @Test + @TestMetadata("VarDeferredInitInOpenClass.kt") + public void testVarDeferredInitInOpenClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/VarDeferredInitInOpenClass.kt"); + } } @Nested diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index 859c3f78bc8..0bfca28512b 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -2995,6 +2995,30 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia public void testSetterWithExplicitType() throws Exception { runTest("compiler/testData/diagnostics/tests/backingField/SetterWithExplicitType.kt"); } + + @Test + @TestMetadata("ValDeferredInitInFinalClass.kt") + public void testValDeferredInitInFinalClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/ValDeferredInitInFinalClass.kt"); + } + + @Test + @TestMetadata("ValDeferredInitInOpenClass.kt") + public void testValDeferredInitInOpenClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/ValDeferredInitInOpenClass.kt"); + } + + @Test + @TestMetadata("VarDeferredInitInFinalClass.kt") + public void testVarDeferredInitInFinalClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/VarDeferredInitInFinalClass.kt"); + } + + @Test + @TestMetadata("VarDeferredInitInOpenClass.kt") + public void testVarDeferredInitInOpenClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/VarDeferredInitInOpenClass.kt"); + } } @Nested diff --git a/compiler/testData/diagnostics/tests/backingField/ValDeferredInitInFinalClass.kt b/compiler/testData/diagnostics/tests/backingField/ValDeferredInitInFinalClass.kt new file mode 100644 index 00000000000..8c71c210e5f --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/ValDeferredInitInFinalClass.kt @@ -0,0 +1,71 @@ +// FIR_IDENTICAL +// !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 getter + val a0: Int + val e0: Int + val c0: Int = 1 + override val b0: Int + override val f0: Int + override val d0: Int = 1 + + // getter with field + val a1: Int; get() = field + val e1: Int; get() = field + val c1: Int = 1; get() = field + override val b1: Int; get() = field + override val f1: Int; get() = field + override val d1: Int = 1; get() = field + + // getter with empty body + val a2: Int; get + val e2: Int; get + val c2: Int = 1; get + override val b2: Int; get + override val f2: Int; get + override val d2: Int = 1; get + + // getter no field + val a3: Int; get() = 1 + val e3: Int; get() = 1 + val c3: Int = 1; get() = 1 + override val b3: Int; get() = 1 + override val f3: Int; get() = 1 + override val d3: Int = 1; get() = 1 + + init { + a0 = 1 + a1 = 1 + a2 = 1 + a3 = 1 + + b0 = 1 + b1 = 1 + b2 = 1 + b3 = 1 + } +} + +interface I { + val b0: Int + val b1: Int + val b2: Int + val b3: Int + + val f0: Int + val f1: Int + val f2: Int + val f3: Int + + val d0: Int + val d1: Int + val d2: Int + val d3: Int +} diff --git a/compiler/testData/diagnostics/tests/backingField/ValDeferredInitInOpenClass.kt b/compiler/testData/diagnostics/tests/backingField/ValDeferredInitInOpenClass.kt new file mode 100644 index 00000000000..8f9f97584cd --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/ValDeferredInitInOpenClass.kt @@ -0,0 +1,54 @@ +// FIR_IDENTICAL +// !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/VarDeferredInitInFinalClass.fir.kt b/compiler/testData/diagnostics/tests/backingField/VarDeferredInitInFinalClass.fir.kt new file mode 100644 index 00000000000..eb824c23372 --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/VarDeferredInitInFinalClass.fir.kt @@ -0,0 +1,128 @@ +// !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 new file mode 100644 index 00000000000..6e46487da8f --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/VarDeferredInitInFinalClass.kt @@ -0,0 +1,128 @@ +// !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/VarDeferredInitInOpenClass.fir.kt b/compiler/testData/diagnostics/tests/backingField/VarDeferredInitInOpenClass.fir.kt new file mode 100644 index 00000000000..ae6bdeb9ed1 --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/VarDeferredInitInOpenClass.fir.kt @@ -0,0 +1,75 @@ +// !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 new file mode 100644 index 00000000000..4ebc0e5146b --- /dev/null +++ b/compiler/testData/diagnostics/tests/backingField/VarDeferredInitInOpenClass.kt @@ -0,0 +1,75 @@ +// !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/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 6890a191382..eacbecc4571 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -2995,6 +2995,30 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { public void testSetterWithExplicitType() throws Exception { runTest("compiler/testData/diagnostics/tests/backingField/SetterWithExplicitType.kt"); } + + @Test + @TestMetadata("ValDeferredInitInFinalClass.kt") + public void testValDeferredInitInFinalClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/ValDeferredInitInFinalClass.kt"); + } + + @Test + @TestMetadata("ValDeferredInitInOpenClass.kt") + public void testValDeferredInitInOpenClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/ValDeferredInitInOpenClass.kt"); + } + + @Test + @TestMetadata("VarDeferredInitInFinalClass.kt") + public void testVarDeferredInitInFinalClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/VarDeferredInitInFinalClass.kt"); + } + + @Test + @TestMetadata("VarDeferredInitInOpenClass.kt") + public void testVarDeferredInitInOpenClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/backingField/VarDeferredInitInOpenClass.kt"); + } } @Nested