diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java index dd05f944457..6b0b4a3913d 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java @@ -11473,6 +11473,11 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirOldFronte runTest("compiler/testData/diagnostics/tests/inference/regressions/kt37043_2.kt"); } + @TestMetadata("kt37650.kt") + public void testKt37650() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/regressions/kt37650.kt"); + } + @TestMetadata("kt4420.kt") public void testKt4420() throws Exception { runTest("compiler/testData/diagnostics/tests/inference/regressions/kt4420.kt"); diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintIncorporator.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintIncorporator.kt index 58d654fe9c9..0bdcf7e2b6a 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintIncorporator.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/ConstraintIncorporator.kt @@ -209,8 +209,14 @@ class ConstraintIncorporator( val isUsefulForNullabilityConstraint = isPotentialUsefulNullabilityConstraint(newConstraint, otherConstraint.type, otherConstraint.kind) + val isFromVariableFixation = baseConstraint.position.from is FixVariableConstraintPosition + || otherConstraint.position.from is FixVariableConstraintPosition + + if (!containsConstrainingTypeWithoutProjection(newConstraint, otherConstraint) + && !isUsefulForNullabilityConstraint + && !isFromVariableFixation + ) return - if (!isUsefulForNullabilityConstraint && !containsConstrainingTypeWithoutProjection(newConstraint, otherConstraint)) return if (trivialConstraintTypeInferenceOracle.isGeneratedConstraintTrivial( baseConstraint, otherConstraint, newConstraint, isSubtype ) diff --git a/compiler/testData/diagnostics/tests/inference/constraints/definitelyNotNullTypeInArguments.fir.kt b/compiler/testData/diagnostics/tests/inference/constraints/definitelyNotNullTypeInArguments.fir.kt index ab93e7dad9b..b11d5abb53d 100644 --- a/compiler/testData/diagnostics/tests/inference/constraints/definitelyNotNullTypeInArguments.fir.kt +++ b/compiler/testData/diagnostics/tests/inference/constraints/definitelyNotNullTypeInArguments.fir.kt @@ -52,7 +52,6 @@ fun main(x: L?, y: L) { foo3(x, Foo(Bar())) foo3(y, Foo(Bar())) - // Change after fix KT-37380 foo4(x, Foo(Bar())) foo4(y, Foo(Bar())) @@ -124,11 +123,9 @@ fun main(x: L?, y: L) { foo22(x, Foo(Foo(InBar()))) foo22(y, Foo(Foo(InBar()))) - // Change after fix KT-37380 foo23(x, Foo(Foo(Bar()))) foo23(y, Foo(Foo(Bar()))) - // Change after fix KT-37380 foo24(x, Foo(Foo(Bar()))) foo24(y, Foo(Foo(Bar()))) } diff --git a/compiler/testData/diagnostics/tests/inference/constraints/definitelyNotNullTypeInArguments.kt b/compiler/testData/diagnostics/tests/inference/constraints/definitelyNotNullTypeInArguments.kt index 4ff53d982e3..bde686d5303 100644 --- a/compiler/testData/diagnostics/tests/inference/constraints/definitelyNotNullTypeInArguments.kt +++ b/compiler/testData/diagnostics/tests/inference/constraints/definitelyNotNullTypeInArguments.kt @@ -52,9 +52,8 @@ fun main(x: L?, y: L) { foo3(x, >")!>Foo(Bar())) foo3(y, >")!>Foo(Bar())) - // Change after fix KT-37380 - foo4(x, >"), TYPE_MISMATCH!>Foo(Bar())) - foo4(y, >"), TYPE_MISMATCH!>Foo(Bar())) + foo4(x, >")!>Foo(Bar())) + foo4(y, >")!>Foo(Bar())) foo5(x, ")!>Bar()) foo5(y, ")!>Bar()) @@ -124,11 +123,9 @@ fun main(x: L?, y: L) { foo22(x, >>")!>Foo(Foo(InBar()))) foo22(y, >>")!>Foo(Foo(InBar()))) - // Change after fix KT-37380 - foo23(x, >>"), TYPE_MISMATCH!>Foo(Foo(Bar()))) - foo23(y, >>"), TYPE_MISMATCH!>Foo(Foo(Bar()))) + foo23(x, >>")!>Foo(Foo(Bar()))) + foo23(y, >>")!>Foo(Foo(Bar()))) - // Change after fix KT-37380 - foo24(x, >>"), TYPE_MISMATCH!>Foo(Foo(Bar()))) - foo24(y, >>"), TYPE_MISMATCH!>Foo(Foo(Bar()))) + foo24(x, >>")!>Foo(Foo(Bar()))) + foo24(y, >>")!>Foo(Foo(Bar()))) } diff --git a/compiler/testData/diagnostics/tests/inference/constraints/definitelyNotNullTypeInReturnPosition.kt b/compiler/testData/diagnostics/tests/inference/constraints/definitelyNotNullTypeInReturnPosition.kt index e04b0b41713..088cc29d558 100644 --- a/compiler/testData/diagnostics/tests/inference/constraints/definitelyNotNullTypeInReturnPosition.kt +++ b/compiler/testData/diagnostics/tests/inference/constraints/definitelyNotNullTypeInReturnPosition.kt @@ -245,8 +245,8 @@ class Main(x: L?, y: L) { val x420 = ")!>foo42(x) val x421 = ")!>foo42(y) - val x430 = & IFoo}")!>foo43(x) - val x431 = & IFoo}")!>foo43(y) + val x430 = & IBar & IFoo & IFoo}")!>foo43(x) + val x431 = & IBar & IFoo & IFoo}")!>foo43(y) // Change after fix KT-37380 val x440 = & IFoo}")!>foo44(x) diff --git a/compiler/testData/diagnostics/tests/inference/regressions/kt37650.kt b/compiler/testData/diagnostics/tests/inference/regressions/kt37650.kt new file mode 100644 index 00000000000..a9c74ce6434 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/regressions/kt37650.kt @@ -0,0 +1,14 @@ +// FIR_IDENTICAL +// !LANGUAGE: +NewInference +// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE + +class Inv + +fun materialize(): T = TODO() + +fun foo(x: Inv) {} +fun bar(y: Inv): Inv> = materialize() + +fun test(plant: Inv) { + val x = foo(bar(plant)) // OK in OI, NI: "Not enough information to infer type variable A" +} diff --git a/compiler/testData/diagnostics/tests/inference/regressions/kt37650.txt b/compiler/testData/diagnostics/tests/inference/regressions/kt37650.txt new file mode 100644 index 00000000000..f9a92ac3f33 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/regressions/kt37650.txt @@ -0,0 +1,13 @@ +package + +public fun bar(/*0*/ y: Inv): Inv> +public fun foo(/*0*/ x: Inv): kotlin.Unit +public fun materialize(): T +public fun test(/*0*/ plant: Inv): kotlin.Unit + +public final class Inv { + public constructor Inv() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/inference/kt11266.kt b/compiler/testData/diagnostics/testsWithStdLib/inference/kt11266.kt index 218fb33e0e4..ba3299f2b20 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/inference/kt11266.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/inference/kt11266.kt @@ -1,4 +1,4 @@ // !WITH_NEW_INFERENCE // NI_EXPECTED_FILE -fun foo(first: Array, second: Array) = Pair(first.toCollection(), second.toCollection()) \ No newline at end of file +fun foo(first: Array, second: Array) = Pair(first.toCollection(), second.toCollection()) \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/inference/kt11266.ni.txt b/compiler/testData/diagnostics/testsWithStdLib/inference/kt11266.ni.txt index e1f0a5b5c7b..71d97fe0ee3 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/inference/kt11266.ni.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/inference/kt11266.ni.txt @@ -1,3 +1,3 @@ package -public fun foo(/*0*/ first: kotlin.Array, /*1*/ second: kotlin.Array): [ERROR : Error function type] +public fun foo(/*0*/ first: kotlin.Array, /*1*/ second: kotlin.Array): kotlin.Pair, kotlin.collections.MutableCollection> diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 71029936cd7..b3871a4fef4 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -11480,6 +11480,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTestWithFirVali runTest("compiler/testData/diagnostics/tests/inference/regressions/kt37043_2.kt"); } + @TestMetadata("kt37650.kt") + public void testKt37650() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/regressions/kt37650.kt"); + } + @TestMetadata("kt4420.kt") public void testKt4420() throws Exception { runTest("compiler/testData/diagnostics/tests/inference/regressions/kt4420.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index 52ee095b111..001d6ecc926 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -11475,6 +11475,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing runTest("compiler/testData/diagnostics/tests/inference/regressions/kt37043_2.kt"); } + @TestMetadata("kt37650.kt") + public void testKt37650() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/regressions/kt37650.kt"); + } + @TestMetadata("kt4420.kt") public void testKt4420() throws Exception { runTest("compiler/testData/diagnostics/tests/inference/regressions/kt4420.kt");