diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 121ac441c5d..8df8463e9c1 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -18489,6 +18489,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/inference/builderInference/kt48633.kt"); } + @Test + @TestMetadata("kt49285.kt") + public void testKt49285() throws Exception { + runTest("compiler/testData/codegen/box/inference/builderInference/kt49285.kt"); + } + @Test @TestMetadata("labaledCall.kt") public void testLabaledCall() throws Exception { diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/ConeInferenceContext.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/ConeInferenceContext.kt index 58217044a4a..1e48d04f4cf 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/ConeInferenceContext.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/ConeInferenceContext.kt @@ -129,6 +129,11 @@ interface ConeInferenceContext : TypeSystemInferenceExtensionContext, ConeTypeCo return this.isExtensionFunctionType } + override fun StubTypeMarker.getOriginalTypeVariable(): TypeVariableTypeConstructorMarker { + require(this is ConeStubType) + return this.variable.typeConstructor + } + override fun KotlinTypeMarker.typeDepth() = when (this) { is ConeSimpleKotlinType -> typeDepth() is ConeFlexibleType -> maxOf(lowerBound().typeDepth(), upperBound().typeDepth()) diff --git a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/components/PostponedArgumentsAnalyzerContext.kt b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/components/PostponedArgumentsAnalyzerContext.kt index 35788d0fda6..df82c8ef4af 100644 --- a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/components/PostponedArgumentsAnalyzerContext.kt +++ b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/components/PostponedArgumentsAnalyzerContext.kt @@ -19,6 +19,8 @@ interface PostponedArgumentsAnalyzerContext : TypeSystemInferenceExtensionContex fun hasUpperOrEqualUnitConstraint(type: KotlinTypeMarker): Boolean + fun removePostponedTypeVariablesFromConstraints(postponedTypeVariables: Set) + // mutable operations fun addOtherSystem(otherSystem: ConstraintStorage) diff --git a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/model/NewConstraintSystemImpl.kt b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/model/NewConstraintSystemImpl.kt index 0e8f196b330..5a31f48f7a9 100644 --- a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/model/NewConstraintSystemImpl.kt +++ b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/inference/model/NewConstraintSystemImpl.kt @@ -531,4 +531,12 @@ class NewConstraintSystemImpl( it.type.lowerBoundIfFlexible().isUnit() } } + + override fun removePostponedTypeVariablesFromConstraints(postponedTypeVariables: Set) { + for ((_, variableWithConstraints) in storage.notFixedTypeVariables) { + variableWithConstraints.removeConstrains { constraint -> + constraint.type.contains { it is StubTypeMarker && it.getOriginalTypeVariable() in postponedTypeVariables } + } + } + } } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/PostponedArgumentsAnalyzer.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/PostponedArgumentsAnalyzer.kt index 461e946ef7d..25f245b7f90 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/PostponedArgumentsAnalyzer.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/PostponedArgumentsAnalyzer.kt @@ -211,6 +211,8 @@ class PostponedArgumentsAnalyzer( // We add <: TypeVariable(T) to be able to contribute type info from several builder inference lambdas c.getBuilder().addSubtypeConstraint(resultType, variable.defaultType(c), BuilderInferencePosition) } + + c.removePostponedTypeVariablesFromConstraints(postponedVariables.keys) } } diff --git a/compiler/testData/codegen/box/inference/builderInference/kt49285.kt b/compiler/testData/codegen/box/inference/builderInference/kt49285.kt new file mode 100644 index 00000000000..6c40dfd8337 --- /dev/null +++ b/compiler/testData/codegen/box/inference/builderInference/kt49285.kt @@ -0,0 +1,25 @@ +// DONT_TARGET_EXACT_BACKEND: WASM +// IGNORE_BACKEND_FIR: JVM_IR +// WITH_RUNTIME + +import kotlin.experimental.ExperimentalTypeInference + +class Foo { + fun add(x: T) {} +} + +@OptIn(ExperimentalTypeInference::class) +fun myBuilder1(@BuilderInference builder: Foo.() -> Foo): Foo = Foo().apply { builder() } + +@OptIn(ExperimentalTypeInference::class) +fun myBuilder2(@BuilderInference builder: Foo.() -> Unit): Foo = Foo().apply(builder) + +fun box(): String { + val result1 = myBuilder1 { + add(null) + myBuilder2 { + add("") + } + } + return "OK" +} \ No newline at end of file diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index 21acc9ec521..20211a9f0a1 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -18363,6 +18363,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/inference/builderInference/kt48633.kt"); } + @Test + @TestMetadata("kt49285.kt") + public void testKt49285() throws Exception { + runTest("compiler/testData/codegen/box/inference/builderInference/kt49285.kt"); + } + @Test @TestMetadata("labaledCall.kt") public void testLabaledCall() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 04414982776..7a3b0c269f8 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -18489,6 +18489,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inference/builderInference/kt48633.kt"); } + @Test + @TestMetadata("kt49285.kt") + public void testKt49285() throws Exception { + runTest("compiler/testData/codegen/box/inference/builderInference/kt49285.kt"); + } + @Test @TestMetadata("labaledCall.kt") public void testLabaledCall() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 3bb8f26f871..6f9bbaab8ac 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -15226,6 +15226,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inference/builderInference/kt48633.kt"); } + @TestMetadata("kt49285.kt") + public void testKt49285() throws Exception { + runTest("compiler/testData/codegen/box/inference/builderInference/kt49285.kt"); + } + @TestMetadata("labaledCall.kt") public void testLabaledCall() throws Exception { runTest("compiler/testData/codegen/box/inference/builderInference/labaledCall.kt"); diff --git a/core/compiler.common/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt b/core/compiler.common/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt index aab9bace0ba..406968454cf 100644 --- a/core/compiler.common/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt +++ b/core/compiler.common/src/org/jetbrains/kotlin/types/model/TypeSystemContext.kt @@ -226,6 +226,8 @@ interface TypeSystemInferenceExtensionContext : TypeSystemContext, TypeSystemBui fun KotlinTypeMarker.getFunctionalTypeFromSupertypes(): KotlinTypeMarker + fun StubTypeMarker.getOriginalTypeVariable(): TypeVariableTypeConstructorMarker + fun getFunctionTypeConstructor(parametersNumber: Int, isSuspend: Boolean): TypeConstructorMarker fun getKFunctionTypeConstructor(parametersNumber: Int, isSuspend: Boolean): TypeConstructorMarker diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/checker/ClassicTypeSystemContext.kt b/core/descriptors/src/org/jetbrains/kotlin/types/checker/ClassicTypeSystemContext.kt index c7b272cd142..e2406a7cec2 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/checker/ClassicTypeSystemContext.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/checker/ClassicTypeSystemContext.kt @@ -94,6 +94,11 @@ interface ClassicTypeSystemContext : TypeSystemInferenceExtensionContext, TypeSy return this is StubTypeForBuilderInference || isDefNotNullStubType() } + override fun StubTypeMarker.getOriginalTypeVariable(): TypeVariableTypeConstructorMarker { + require(this is AbstractStubType, this::errorMessage) + return this.originalTypeVariable as TypeVariableTypeConstructorMarker + } + override fun CapturedTypeMarker.lowerType(): KotlinTypeMarker? { require(this is NewCapturedType, this::errorMessage) return this.lowerType diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index 740e437a003..0b275b4bd16 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java @@ -13290,6 +13290,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/inference/builderInference/kt48633.kt"); } + @TestMetadata("kt49285.kt") + public void testKt49285() throws Exception { + runTest("compiler/testData/codegen/box/inference/builderInference/kt49285.kt"); + } + @TestMetadata("labaledCall.kt") public void testLabaledCall() throws Exception { runTest("compiler/testData/codegen/box/inference/builderInference/labaledCall.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index c16a98a156b..e4364e7b322 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -12696,6 +12696,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inference/builderInference/kt48633.kt"); } + @TestMetadata("kt49285.kt") + public void testKt49285() throws Exception { + runTest("compiler/testData/codegen/box/inference/builderInference/kt49285.kt"); + } + @TestMetadata("labaledCall.kt") public void testLabaledCall() throws Exception { runTest("compiler/testData/codegen/box/inference/builderInference/labaledCall.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testNew/JsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testNew/JsCodegenBoxTestGenerated.java index 82e5eef380b..053dd4d6b6e 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testNew/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testNew/JsCodegenBoxTestGenerated.java @@ -14387,6 +14387,13 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inference/builderInference/kt48633.kt"); } + @Test + @TestMetadata("kt49285.kt") + public void testKt49285() throws Exception { + runTest("compiler/testData/codegen/box/inference/builderInference/kt49285.kt"); + } + + @Test @TestMetadata("labaledCall.kt") public void testLabaledCall() throws Exception { runTest("compiler/testData/codegen/box/inference/builderInference/labaledCall.kt");