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 4eb27cecbe9..9e8464c2b11 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 @@ -12558,6 +12558,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/inference/capturedTypes/starProjectionRegression.kt"); } + @Test + @TestMetadata("substituteCapturedTypesWithTypeVariables.kt") + public void testSubstituteCapturedTypesWithTypeVariables() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/capturedTypes/substituteCapturedTypesWithTypeVariables.kt"); + } + @Test @TestMetadata("topLevelCapturingInsideReturnType.kt") public void testTopLevelCapturingInsideReturnType() throws Exception { diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/NewTypeSubstitutor.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/NewTypeSubstitutor.kt index 8a795862d30..7a94cc38321 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/NewTypeSubstitutor.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/NewTypeSubstitutor.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.resolve.calls.inference.components import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.descriptors.annotations.CompositeAnnotations +import org.jetbrains.kotlin.resolve.calls.inference.isCaptured import org.jetbrains.kotlin.resolve.calls.inference.model.TypeVariableFromCallableDescriptor import org.jetbrains.kotlin.resolve.calls.inference.substitute import org.jetbrains.kotlin.types.* @@ -105,8 +106,8 @@ interface NewTypeSubstitutor : TypeSubstitutorMarker { val substitutedInnerType = substitute(innerType, keepAnnotation, runCapturedChecks = false) if (substitutedInnerType != null) { - if (innerType is StubType || substitutedInnerType is StubType || innerType.constructor is IntersectionTypeConstructor) { - return NewCapturedType( + return if (substitutedInnerType.isCaptured()) substitutedInnerType else { + NewCapturedType( capturedType.captureStatus, NewCapturedTypeConstructor( TypeProjectionImpl(typeConstructor.projection.projectionKind, substitutedInnerType), @@ -114,8 +115,6 @@ interface NewTypeSubstitutor : TypeSubstitutorMarker { ), lowerType = if (capturedType.lowerType != null) substitutedInnerType else null ) - } else { - throwExceptionAboutInvalidCapturedSubstitution(capturedType, innerType, substitutedInnerType) } } diff --git a/compiler/testData/diagnostics/tests/inference/capturedTypes/substituteCapturedTypesWithTypeVariables.fir.kt b/compiler/testData/diagnostics/tests/inference/capturedTypes/substituteCapturedTypesWithTypeVariables.fir.kt new file mode 100644 index 00000000000..fe6db488f48 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/capturedTypes/substituteCapturedTypesWithTypeVariables.fir.kt @@ -0,0 +1,12 @@ +// !DIAGNOSTICS: -CAST_NEVER_SUCCEEDS -UNUSED_PARAMETER + +class Foo + +fun getFoo(value: T) = null as Foo> +fun takeLambda(block: () -> R) {} + +fun main(x: Int) { + takeLambda { + getFoo(x) + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inference/capturedTypes/substituteCapturedTypesWithTypeVariables.kt b/compiler/testData/diagnostics/tests/inference/capturedTypes/substituteCapturedTypesWithTypeVariables.kt new file mode 100644 index 00000000000..fe6db488f48 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/capturedTypes/substituteCapturedTypesWithTypeVariables.kt @@ -0,0 +1,12 @@ +// !DIAGNOSTICS: -CAST_NEVER_SUCCEEDS -UNUSED_PARAMETER + +class Foo + +fun getFoo(value: T) = null as Foo> +fun takeLambda(block: () -> R) {} + +fun main(x: Int) { + takeLambda { + getFoo(x) + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inference/capturedTypes/substituteCapturedTypesWithTypeVariables.txt b/compiler/testData/diagnostics/tests/inference/capturedTypes/substituteCapturedTypesWithTypeVariables.txt new file mode 100644 index 00000000000..51fc17480a5 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/capturedTypes/substituteCapturedTypesWithTypeVariables.txt @@ -0,0 +1,12 @@ +package + +public fun getFoo(/*0*/ value: T): Foo> +public fun main(/*0*/ x: kotlin.Int): kotlin.Unit +public fun takeLambda(/*0*/ block: () -> R): 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 +} 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 98674b54f49..dec8e6abe90 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 @@ -12564,6 +12564,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/inference/capturedTypes/starProjectionRegression.kt"); } + @Test + @TestMetadata("substituteCapturedTypesWithTypeVariables.kt") + public void testSubstituteCapturedTypesWithTypeVariables() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/capturedTypes/substituteCapturedTypesWithTypeVariables.kt"); + } + @Test @TestMetadata("topLevelCapturingInsideReturnType.kt") public void testTopLevelCapturingInsideReturnType() throws Exception {