From 93f9d9dacd55e4b315a785a327512f01c1a8d87c Mon Sep 17 00:00:00 2001 From: Victor Petukhov Date: Wed, 28 Jul 2021 16:49:22 +0300 Subject: [PATCH] Check if the intersecting types aren't empty during finding the result type for variable fixation ^KT-47941 Fixed --- ...irOldFrontendDiagnosticsTestGenerated.java | 6 ++++ ...DiagnosticsWithLightTreeTestGenerated.java | 6 ++++ .../components/ResultTypeResolver.kt | 3 +- .../tests/inference/regressions/kt47941.kt | 29 ++++++++++++++++ .../tests/inference/regressions/kt47941.txt | 33 +++++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++++ ...CompilerTestFE10TestdataTestGenerated.java | 6 ++++ 7 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/inference/regressions/kt47941.kt create mode 100644 compiler/testData/diagnostics/tests/inference/regressions/kt47941.txt 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 c93a0b5254a..1c51433c2f5 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 @@ -15234,6 +15234,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/inference/regressions/kt44440.kt"); } + @Test + @TestMetadata("kt47941.kt") + public void testKt47941() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/regressions/kt47941.kt"); + } + @Test @TestMetadata("kt702.kt") public void testKt702() 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 de1d0562883..9b2ba8cb5b9 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 @@ -15234,6 +15234,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/inference/regressions/kt44440.kt"); } + @Test + @TestMetadata("kt47941.kt") + public void testKt47941() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/regressions/kt47941.kt"); + } + @Test @TestMetadata("kt702.kt") public void testKt702() throws Exception { diff --git a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/components/ResultTypeResolver.kt b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/components/ResultTypeResolver.kt index 1b8bd25e09e..640edddddf1 100644 --- a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/components/ResultTypeResolver.kt +++ b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/components/ResultTypeResolver.kt @@ -265,7 +265,8 @@ class ResultTypeResolver( * fun materialize(): T = null as T * val bar: Int = materialize() // no errors, T is inferred into String & Int */ - intersectTypes(upperConstraints.filterNot { it.isExpectedTypePosition() }.map { it.type }) + val filteredUpperConstraints = upperConstraints.filterNot { it.isExpectedTypePosition() }.map { it.type } + if (filteredUpperConstraints.isNotEmpty()) intersectTypes(filteredUpperConstraints) else intersectionUpperType } else intersectionUpperType return typeApproximator.approximateToSubType( diff --git a/compiler/testData/diagnostics/tests/inference/regressions/kt47941.kt b/compiler/testData/diagnostics/tests/inference/regressions/kt47941.kt new file mode 100644 index 00000000000..d7ce98096a7 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/regressions/kt47941.kt @@ -0,0 +1,29 @@ +// FIR_IDENTICAL +// !DIAGNOSTICS: -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE -UNCHECKED_CAST +// WITH_RUNTIME + +sealed interface Metric {} + +class Counter: Metric +class Gauge: Metric + +fun foo(y: List, x: Inv, p: (Inv, K?) -> Unit) {} +fun materialize(): M = null as M + +class Inv(var x: L) + +fun register(name: String, metric: T): T? { + when (metric) { + is Counter -> { + return metric + } + is Gauge<*> -> { + foo(listOf(), Inv(metric)) { x, y -> + var a = y + a = materialize() + } + return metric + } + else -> return null + } +} diff --git a/compiler/testData/diagnostics/tests/inference/regressions/kt47941.txt b/compiler/testData/diagnostics/tests/inference/regressions/kt47941.txt new file mode 100644 index 00000000000..fe07ab3dbb4 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/regressions/kt47941.txt @@ -0,0 +1,33 @@ +package + +public fun foo(/*0*/ y: kotlin.collections.List, /*1*/ x: Inv, /*2*/ p: (Inv, K?) -> kotlin.Unit): kotlin.Unit +public fun materialize(): M +public fun register(/*0*/ name: kotlin.String, /*1*/ metric: T): T? + +public final class Counter : Metric { + public constructor Counter() + 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 Gauge : Metric { + public constructor Gauge() + 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(/*0*/ x: L) + public final var x: L + 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 sealed interface Metric { + 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-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 c108ca604ed..0c0e4383c60 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 @@ -15240,6 +15240,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/inference/regressions/kt44440.kt"); } + @Test + @TestMetadata("kt47941.kt") + public void testKt47941() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/regressions/kt47941.kt"); + } + @Test @TestMetadata("kt702.kt") public void testKt702() throws Exception { diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index 9819cba51f0..a2cecdcdd3b 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -15234,6 +15234,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/inference/regressions/kt44440.kt"); } + @Test + @TestMetadata("kt47941.kt") + public void testKt47941() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/regressions/kt47941.kt"); + } + @Test @TestMetadata("kt702.kt") public void testKt702() throws Exception {