From a5ae1b38b06bc352be3d50f7dfb2d69f20661367 Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Tue, 23 Jun 2020 12:56:12 +0300 Subject: [PATCH] Don't skip constraints from equations with the kind equal The problem was that we didn't incorporate T == Foo into K <: Inv. It happened because of optimisation that isn't applicable here as we already have projection in the initial type #KT-39777 Fixed --- ...irOldFrontendDiagnosticsTestGenerated.java | 5 +++++ .../components/ConstraintIncorporator.kt | 7 ++++--- ...alitySubstitutionInsideNonInvariantType.kt | 17 +++++++++++++++ ...litySubstitutionInsideNonInvariantType.txt | 21 +++++++++++++++++++ .../checkers/DiagnosticsTestGenerated.java | 5 +++++ .../DiagnosticsUsingJavacTestGenerated.java | 5 +++++ 6 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/inference/equalitySubstitutionInsideNonInvariantType.kt create mode 100644 compiler/testData/diagnostics/tests/inference/equalitySubstitutionInsideNonInvariantType.txt 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 13fbfa7bc11..8f12187f6f6 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 @@ -10006,6 +10006,11 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirOldFronte runTest("compiler/testData/diagnostics/tests/inference/dependantOnVarianceNullable.kt"); } + @TestMetadata("equalitySubstitutionInsideNonInvariantType.kt") + public void testEqualitySubstitutionInsideNonInvariantType() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/equalitySubstitutionInsideNonInvariantType.kt"); + } + @TestMetadata("expectedTypeAdditionalTest.kt") public void testExpectedTypeAdditionalTest() throws Exception { runTest("compiler/testData/diagnostics/tests/inference/expectedTypeAdditionalTest.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 f51a414b39d..f2a6d3d739e 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 @@ -221,9 +221,10 @@ class ConstraintIncorporator( val isFromVariableFixation = baseConstraint.position.from is FixVariableConstraintPosition || otherConstraint.position.from is FixVariableConstraintPosition - if (!containsConstrainingTypeWithoutProjection(newConstraint, otherConstraint) - && !isUsefulForNullabilityConstraint - && !isFromVariableFixation + if (!otherConstraint.kind.isEqual() && + !isUsefulForNullabilityConstraint && + !isFromVariableFixation && + !containsConstrainingTypeWithoutProjection(newConstraint, otherConstraint) ) return if (trivialConstraintTypeInferenceOracle.isGeneratedConstraintTrivial( diff --git a/compiler/testData/diagnostics/tests/inference/equalitySubstitutionInsideNonInvariantType.kt b/compiler/testData/diagnostics/tests/inference/equalitySubstitutionInsideNonInvariantType.kt new file mode 100644 index 00000000000..24d3caa0b53 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/equalitySubstitutionInsideNonInvariantType.kt @@ -0,0 +1,17 @@ +// FIR_IDENTICAL +// !DIAGNOSTICS: -UNUSED_PARAMETER + +fun materialize(): K = TODO() + +class Foo +class Inv + +fun test1(x: Inv) {} +fun test2(x: Inv) {} +fun test3(x: Inv) {} + +fun main() { + test1(materialize()) + test2(materialize()) + test3(materialize()) +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inference/equalitySubstitutionInsideNonInvariantType.txt b/compiler/testData/diagnostics/tests/inference/equalitySubstitutionInsideNonInvariantType.txt new file mode 100644 index 00000000000..a8a004b5700 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/equalitySubstitutionInsideNonInvariantType.txt @@ -0,0 +1,21 @@ +package + +public fun main(): kotlin.Unit +public fun materialize(): K +public fun test1(/*0*/ x: Inv): kotlin.Unit +public fun test2(/*0*/ x: Inv): kotlin.Unit +public fun test3(/*0*/ x: Inv): kotlin.Unit + +public final class Foo { + public constructor Foo() + 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 +} + +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/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index d2fc13bede4..93e1de72a1a 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -10013,6 +10013,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTestWithFirVali runTest("compiler/testData/diagnostics/tests/inference/dependantOnVarianceNullable.kt"); } + @TestMetadata("equalitySubstitutionInsideNonInvariantType.kt") + public void testEqualitySubstitutionInsideNonInvariantType() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/equalitySubstitutionInsideNonInvariantType.kt"); + } + @TestMetadata("expectedTypeAdditionalTest.kt") public void testExpectedTypeAdditionalTest() throws Exception { runTest("compiler/testData/diagnostics/tests/inference/expectedTypeAdditionalTest.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index 7abab81c5c7..cf78fd6d00b 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -10008,6 +10008,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing runTest("compiler/testData/diagnostics/tests/inference/dependantOnVarianceNullable.kt"); } + @TestMetadata("equalitySubstitutionInsideNonInvariantType.kt") + public void testEqualitySubstitutionInsideNonInvariantType() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/equalitySubstitutionInsideNonInvariantType.kt"); + } + @TestMetadata("expectedTypeAdditionalTest.kt") public void testExpectedTypeAdditionalTest() throws Exception { runTest("compiler/testData/diagnostics/tests/inference/expectedTypeAdditionalTest.kt");