Add a test for data flow with reassignments in local classes

This commit is contained in:
pyos
2022-12-12 20:01:44 +01:00
committed by Dmitriy Novozhilov
parent 1aae586238
commit c185bf60f8
6 changed files with 250 additions and 0 deletions
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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<!UNSAFE_CALL!>.<!>length // bad
if (<!SENSELESS_COMPARISON!>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() = <!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
fun bar() { x = null }
fun baz() = <!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
}
<!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
if (x != null) {
o.bar() // assign here
<!SMARTCAST_IMPOSSIBLE!>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() = <!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
}
x.length // bad
if (<!SENSELESS_COMPARISON!>x != null<!>) {
y = null
C() // read y & assign x here
x.length // bad
}
::C
}
x.length // bad
if (<!SENSELESS_COMPARISON!>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() = <!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
fun bar() { x = null }
fun baz() = <!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
}
<!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
if (x != null) {
C().bar() // assign here
<!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
}
::C
}
<!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
if (x != null) {
y = null
ctor().bar() // read y & assign x here
<!SMARTCAST_IMPOSSIBLE!>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 { <!SMARTCAST_IMPOSSIBLE!>x<!>.length } } }, // bad
{ x = null },
)
<!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
}
@@ -0,0 +1,113 @@
// SKIP_TXT
fun objectInit() {
var x: String?
var y: String?
x = ""
y = ""
<!DEBUG_INFO_SMARTCAST!>x<!>.length // ok
<!DEBUG_INFO_SMARTCAST!>y<!>.length // ok
val o = object {
init { <!SMARTCAST_IMPOSSIBLE!>x<!>.length } // ?
init { x = null }
init { <!SMARTCAST_IMPOSSIBLE!>x<!>.length } // bad
init { <!SMARTCAST_IMPOSSIBLE!>y<!>.length } // ok
fun foo() = <!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
}
y = null
<!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
if (x != null) <!SMARTCAST_IMPOSSIBLE!>x<!>.length // ok
}
fun objectMethod() {
var x: String?
x = ""
<!DEBUG_INFO_SMARTCAST!>x<!>.length // ok
val o = object {
init { <!SMARTCAST_IMPOSSIBLE!>x<!>.length } // sort of bad
fun foo() = <!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
fun bar() { x = null }
fun baz() = <!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
}
<!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
if (x != null) {
o.bar() // assign here
<!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
}
}
fun classInit() {
var x: String?
var y: String?
x = ""
y = ""
<!DEBUG_INFO_SMARTCAST!>x<!>.length // ok
<!DEBUG_INFO_SMARTCAST!>y<!>.length // ok
val ctor = run {
class C {
init { <!SMARTCAST_IMPOSSIBLE!>x<!>.length } // ?
init { x = null }
init { <!SMARTCAST_IMPOSSIBLE!>x<!>.length } // bad
init { <!SMARTCAST_IMPOSSIBLE!>y<!>.length } // bad
fun foo() = <!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
}
<!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
if (x != null) {
y = null
C() // read y & assign x here
<!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
}
::C
}
<!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
if (x != null) {
ctor() // read y & assign x here
<!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
}
}
fun classMethod() {
var x: String?
var y: String?
x = ""
y = ""
<!DEBUG_INFO_SMARTCAST!>x<!>.length // ok
<!DEBUG_INFO_SMARTCAST!>y<!>.length // ok
val ctor = run {
class C {
init { <!SMARTCAST_IMPOSSIBLE!>x<!>.length } // sort of bad
init { <!SMARTCAST_IMPOSSIBLE!>y<!>.length } // bad
fun foo() = <!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
fun bar() { x = null }
fun baz() = <!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
}
<!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
if (x != null) {
C().bar() // assign here
<!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
}
::C
}
<!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
if (x != null) {
y = null
ctor().bar() // read y & assign x here
<!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
}
}
fun runInInverseOrder(x: Any?, a: () -> Unit, b: () -> Unit) {
b()
a()
}
fun objectInParallelLambda() {
var x: String?
x = ""
runInInverseOrder(
object { init { <!SMARTCAST_IMPOSSIBLE!>x<!>.length } }, // ok
{ object { init { <!SMARTCAST_IMPOSSIBLE!>x<!>.length } } }, // bad
{ x = null },
)
<!SMARTCAST_IMPOSSIBLE!>x<!>.length // bad
}
@@ -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 {