From 8f9c09482b6a8058dfceb15e250790214ccc3752 Mon Sep 17 00:00:00 2001 From: "Denis.Zharkov" Date: Thu, 11 Jan 2024 11:28:52 +0100 Subject: [PATCH] K2: Fix inference from assignment in PCLA Before this, the order of the constraints being added was incorrect ^KT-64222 Fixed --- .../FirExpressionsResolveTransformer.kt | 3 ++- .../builderInference/issues/kt63841.fir.kt | 4 ++-- .../builderInference/issues/kt64222.fir.kt | 16 --------------- .../tests/builderInference/issues/kt64222.kt | 1 + .../unsafeAssignmentExtra.fir.kt | 12 +++++------ .../unsafeAssignmentExtra.fir.txt | 20 +++++++++---------- 6 files changed, 21 insertions(+), 35 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/builderInference/issues/kt64222.fir.kt diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt index 4c49bda9471..d2f2622ae34 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt @@ -1035,7 +1035,8 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT // for cases like // buildSomething { tVar = "" // Should infer TV from String assignment } context.inferenceSession.addSubtypeConstraintIfCompatible( - variableAssignment.lValue.resolvedType, variableAssignment.rValue.resolvedType, + lowerType = variableAssignment.rValue.resolvedType, + upperType = variableAssignment.lValue.resolvedType, variableAssignment, ) diff --git a/compiler/testData/diagnostics/tests/builderInference/issues/kt63841.fir.kt b/compiler/testData/diagnostics/tests/builderInference/issues/kt63841.fir.kt index b1601b2803d..04e76614126 100644 --- a/compiler/testData/diagnostics/tests/builderInference/issues/kt63841.fir.kt +++ b/compiler/testData/diagnostics/tests/builderInference/issues/kt63841.fir.kt @@ -27,14 +27,14 @@ fun test() { var variable = getTypeVariable() variable = TargetType() variable.targetTypeMemberFunction() - variable = DifferentType() + variable = DifferentType() variable.targetTypeMemberFunction() variable = TargetType() variable.targetTypeMemberFunction() } // exact type equality check — turns unexpected compile-time behavior into red code // considered to be non-user-reproducible code for the purposes of these tests - checkExactType>(anyBuildee) + checkExactType>(anyBuildee) } diff --git a/compiler/testData/diagnostics/tests/builderInference/issues/kt64222.fir.kt b/compiler/testData/diagnostics/tests/builderInference/issues/kt64222.fir.kt deleted file mode 100644 index ccb14571793..00000000000 --- a/compiler/testData/diagnostics/tests/builderInference/issues/kt64222.fir.kt +++ /dev/null @@ -1,16 +0,0 @@ -// ISSUE: KT-64222 - -interface A { - fun bar(): B -} - -interface B -fun foo(block: B.() -> Unit): B = TODO() - -class C : A { - private var value: B? = null - - override fun bar() = foo { - value = this - } -} diff --git a/compiler/testData/diagnostics/tests/builderInference/issues/kt64222.kt b/compiler/testData/diagnostics/tests/builderInference/issues/kt64222.kt index 7b1d6ef4671..663e89b61fb 100644 --- a/compiler/testData/diagnostics/tests/builderInference/issues/kt64222.kt +++ b/compiler/testData/diagnostics/tests/builderInference/issues/kt64222.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // ISSUE: KT-64222 interface A { diff --git a/compiler/testData/diagnostics/testsWithStdLib/builderInference/unsafeAssignmentExtra.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/builderInference/unsafeAssignmentExtra.fir.kt index a8d80979a6c..9752dd56719 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/builderInference/unsafeAssignmentExtra.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/builderInference/unsafeAssignmentExtra.fir.kt @@ -46,23 +46,23 @@ fun main(arg: Any, condition: Boolean) { val value2 = myBuilder { accept("") - a = 45 + a = 45 when (condition) { - true -> a = 87 - false -> a = 65 + true -> a = 87 + false -> a = 65 } change { - a = 99 + a = 99 } if (a is Int) { - a = 67 + a = 67 } } // See KT-54664 val value3 = myBuilder { accept("") - a = 45 + a = 45 bar(::a) } diff --git a/compiler/testData/diagnostics/testsWithStdLib/builderInference/unsafeAssignmentExtra.fir.txt b/compiler/testData/diagnostics/testsWithStdLib/builderInference/unsafeAssignmentExtra.fir.txt index 441c5703c07..19c6f6a48d0 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/builderInference/unsafeAssignmentExtra.fir.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/builderInference/unsafeAssignmentExtra.fir.txt @@ -67,33 +67,33 @@ FILE: unsafeAssignmentExtra.fir.kt ) } ) - lval value2: R|Foo| = R|/myBuilder|( = myBuilder@fun R|Foo|.(): R|kotlin/Unit| { + lval value2: R|Foo & java/io/Serializable)>| = R|/myBuilder| & java/io/Serializable)|>( = myBuilder@fun R|Foo & java/io/Serializable)>|.(): R|kotlin/Unit| { this@R|special/anonymous|.R|SubstitutionOverride|(String()) - this@R|special/anonymous|.R|SubstitutionOverride| = Int(45) + this@R|special/anonymous|.R|SubstitutionOverride & java/io/Serializable)|>| = Int(45) when (R|/condition|) { ==($subj$, Boolean(true)) -> { - this@R|special/anonymous|.R|SubstitutionOverride| = Int(87) + this@R|special/anonymous|.R|SubstitutionOverride & java/io/Serializable)|>| = Int(87) } ==($subj$, Boolean(false)) -> { - this@R|special/anonymous|.R|SubstitutionOverride| = Int(65) + this@R|special/anonymous|.R|SubstitutionOverride & java/io/Serializable)|>| = Int(65) } } - this@R|special/anonymous|.R|/change|( = change@fun R|Foo|.(): R|kotlin/Unit| { - this@R|special/anonymous|.R|SubstitutionOverride| = Int(99) + this@R|special/anonymous|.R|/change| & java/io/Serializable)|>( = change@fun R|Foo & java/io/Serializable)>|.(): R|kotlin/Unit| { + this@R|special/anonymous|.R|SubstitutionOverride & java/io/Serializable)|>| = Int(99) } ) when () { - (this@R|special/anonymous|.R|SubstitutionOverride| is R|kotlin/Int|) -> { - this@R|special/anonymous|.R|SubstitutionOverride| = Int(67) + (this@R|special/anonymous|.R|SubstitutionOverride & java/io/Serializable)|>| is R|kotlin/Int|) -> { + this@R|special/anonymous|.R|SubstitutionOverride & java/io/Serializable)|>| = Int(67) } } } ) - lval value3: R|Foo| = R|/myBuilder|( = myBuilder@fun R|Foo|.(): R|kotlin/Unit| { + lval value3: R|Foo & java/io/Serializable)>| = R|/myBuilder| & java/io/Serializable)|>( = myBuilder@fun R|Foo & java/io/Serializable)>|.(): R|kotlin/Unit| { this@R|special/anonymous|.R|SubstitutionOverride|(String()) - this@R|special/anonymous|.R|SubstitutionOverride| = Int(45) + this@R|special/anonymous|.R|SubstitutionOverride & java/io/Serializable)|>| = Int(45) R|/bar#|(::#) } )