From c185bf60f875910c9e7a50d9e6a80d8e22958ec7 Mon Sep 17 00:00:00 2001 From: pyos Date: Mon, 12 Dec 2022 20:01:44 +0100 Subject: [PATCH] Add a test for data flow with reassignments in local classes --- ...CompilerTestFE10TestdataTestGenerated.java | 6 + ...irOldFrontendDiagnosticsTestGenerated.java | 6 + ...DiagnosticsWithLightTreeTestGenerated.java | 6 + .../smartCasts/variables/objectMembers.fir.kt | 113 ++++++++++++++++++ .../smartCasts/variables/objectMembers.kt | 113 ++++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 + 6 files changed, 250 insertions(+) create mode 100644 compiler/testData/diagnostics/tests/smartCasts/variables/objectMembers.fir.kt create mode 100644 compiler/testData/diagnostics/tests/smartCasts/variables/objectMembers.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index 610fe9b0805..5a0f7713abb 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -30901,6 +30901,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/smartCasts/variables/lambdaBetweenArguments.kt"); } + @Test + @TestMetadata("objectMembers.kt") + public void testObjectMembers() throws Exception { + runTest("compiler/testData/diagnostics/tests/smartCasts/variables/objectMembers.kt"); + } + @Test @TestMetadata("property.kt") public void testProperty() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index b48da1ac310..3c79999dd58 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -30997,6 +30997,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/smartCasts/variables/lambdaBetweenArguments.kt"); } + @Test + @TestMetadata("objectMembers.kt") + public void testObjectMembers() throws Exception { + runTest("compiler/testData/diagnostics/tests/smartCasts/variables/objectMembers.kt"); + } + @Test @TestMetadata("property.kt") public void testProperty() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index 3169f975469..3b9e2c52f3e 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -30901,6 +30901,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/smartCasts/variables/lambdaBetweenArguments.kt"); } + @Test + @TestMetadata("objectMembers.kt") + public void testObjectMembers() throws Exception { + runTest("compiler/testData/diagnostics/tests/smartCasts/variables/objectMembers.kt"); + } + @Test @TestMetadata("property.kt") public void testProperty() throws Exception { diff --git a/compiler/testData/diagnostics/tests/smartCasts/variables/objectMembers.fir.kt b/compiler/testData/diagnostics/tests/smartCasts/variables/objectMembers.fir.kt new file mode 100644 index 00000000000..2a21bd42f08 --- /dev/null +++ b/compiler/testData/diagnostics/tests/smartCasts/variables/objectMembers.fir.kt @@ -0,0 +1,113 @@ +// SKIP_TXT + +fun objectInit() { + var x: String? + var y: String? + x = "" + y = "" + x.length // ok + y.length // ok + val o = object { + init { x.length } // ? + init { x = null } + init { x.length } // bad + init { y.length } // ok + fun foo() = x.length // bad + } + y = null + x.length // bad + if (x != null) x.length // ok +} + +fun objectMethod() { + var x: String? + x = "" + x.length // ok + val o = object { + init { x.length } // sort of bad + fun foo() = x.length // bad + fun bar() { x = null } + fun baz() = x.length // bad + } + x.length // bad + if (x != null) { + o.bar() // assign here + x.length // bad + } +} + +fun classInit() { + var x: String? + var y: String? + x = "" + y = "" + x.length // ok + y.length // ok + val ctor = run { + class C { + init { x.length } // ? + init { x = null } + init { x.length } // bad + init { y.length } // bad + fun foo() = x.length // bad + } + x.length // bad + if (x != null) { + y = null + C() // read y & assign x here + x.length // bad + } + ::C + } + x.length // bad + if (x != null) { + ctor() // read y & assign x here + x.length // bad + } +} + +fun classMethod() { + var x: String? + var y: String? + x = "" + y = "" + x.length // ok + y.length // ok + val ctor = run { + class C { + init { x.length } // sort of bad + init { y.length } // bad + fun foo() = x.length // bad + fun bar() { x = null } + fun baz() = x.length // bad + } + x.length // bad + if (x != null) { + C().bar() // assign here + x.length // bad + } + ::C + } + x.length // bad + if (x != null) { + y = null + ctor().bar() // read y & assign x here + x.length // bad + } +} + +fun runInInverseOrder(x: Any?, a: () -> Unit, b: () -> Unit) { + b() + a() +} + +fun objectInParallelLambda() { + var x: String? + x = "" + runInInverseOrder( + object { init { x.length } }, // ok + { object { init { x.length } } }, // bad + { x = null }, + ) + x.length // bad +} diff --git a/compiler/testData/diagnostics/tests/smartCasts/variables/objectMembers.kt b/compiler/testData/diagnostics/tests/smartCasts/variables/objectMembers.kt new file mode 100644 index 00000000000..0fa4a874490 --- /dev/null +++ b/compiler/testData/diagnostics/tests/smartCasts/variables/objectMembers.kt @@ -0,0 +1,113 @@ +// SKIP_TXT + +fun objectInit() { + var x: String? + var y: String? + x = "" + y = "" + x.length // ok + y.length // ok + val o = object { + init { x.length } // ? + init { x = null } + init { x.length } // bad + init { y.length } // ok + fun foo() = x.length // bad + } + y = null + x.length // bad + if (x != null) x.length // ok +} + +fun objectMethod() { + var x: String? + x = "" + x.length // ok + val o = object { + init { x.length } // sort of bad + fun foo() = x.length // bad + fun bar() { x = null } + fun baz() = x.length // bad + } + x.length // bad + if (x != null) { + o.bar() // assign here + x.length // bad + } +} + +fun classInit() { + var x: String? + var y: String? + x = "" + y = "" + x.length // ok + y.length // ok + val ctor = run { + class C { + init { x.length } // ? + init { x = null } + init { x.length } // bad + init { y.length } // bad + fun foo() = x.length // bad + } + x.length // bad + if (x != null) { + y = null + C() // read y & assign x here + x.length // bad + } + ::C + } + x.length // bad + if (x != null) { + ctor() // read y & assign x here + x.length // bad + } +} + +fun classMethod() { + var x: String? + var y: String? + x = "" + y = "" + x.length // ok + y.length // ok + val ctor = run { + class C { + init { x.length } // sort of bad + init { y.length } // bad + fun foo() = x.length // bad + fun bar() { x = null } + fun baz() = x.length // bad + } + x.length // bad + if (x != null) { + C().bar() // assign here + x.length // bad + } + ::C + } + x.length // bad + if (x != null) { + y = null + ctor().bar() // read y & assign x here + x.length // bad + } +} + +fun runInInverseOrder(x: Any?, a: () -> Unit, b: () -> Unit) { + b() + a() +} + +fun objectInParallelLambda() { + var x: String? + x = "" + runInInverseOrder( + object { init { x.length } }, // ok + { object { init { x.length } } }, // bad + { x = null }, + ) + x.length // bad +} 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 8e28ee0d409..bedefef5e81 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 @@ -30997,6 +30997,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/smartCasts/variables/lambdaBetweenArguments.kt"); } + @Test + @TestMetadata("objectMembers.kt") + public void testObjectMembers() throws Exception { + runTest("compiler/testData/diagnostics/tests/smartCasts/variables/objectMembers.kt"); + } + @Test @TestMetadata("property.kt") public void testProperty() throws Exception {