diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index c6de1ffab07..1cde13a6d25 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -14453,6 +14453,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/inference/builderInference/multiLambdaRestrictionDisabled.kt"); } + @Test + @TestMetadata("noBuilderInferenceRestrictionReceiverInconsistency.kt") + public void testNoBuilderInferenceRestrictionReceiverInconsistency() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/builderInference/noBuilderInferenceRestrictionReceiverInconsistency.kt"); + } + @Test @TestMetadata("propertySubstitution.kt") public void testPropertySubstitution() throws Exception { 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 ed19c87192a..624b3f405f6 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 @@ -14453,6 +14453,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/inference/builderInference/multiLambdaRestrictionDisabled.kt"); } + @Test + @TestMetadata("noBuilderInferenceRestrictionReceiverInconsistency.kt") + public void testNoBuilderInferenceRestrictionReceiverInconsistency() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/builderInference/noBuilderInferenceRestrictionReceiverInconsistency.kt"); + } + @Test @TestMetadata("propertySubstitution.kt") public void testPropertySubstitution() 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 47af1e02b2f..c9efc79e2b6 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 @@ -14453,6 +14453,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/inference/builderInference/multiLambdaRestrictionDisabled.kt"); } + @Test + @TestMetadata("noBuilderInferenceRestrictionReceiverInconsistency.kt") + public void testNoBuilderInferenceRestrictionReceiverInconsistency() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/builderInference/noBuilderInferenceRestrictionReceiverInconsistency.kt"); + } + @Test @TestMetadata("propertySubstitution.kt") public void testPropertySubstitution() throws Exception { diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ResolutionParts.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ResolutionParts.kt index d45efcd58f6..36eff2e0bf3 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ResolutionParts.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ResolutionParts.kt @@ -663,23 +663,23 @@ internal object CheckReceivers : ResolutionPart() { ) 1 -> { + var extensionReceiverArgument = resolvedCall.extensionReceiverArgument + if (extensionReceiverArgument == null) { + extensionReceiverArgument = chooseExtensionReceiverCandidate() ?: return + resolvedCall.extensionReceiverArgument = extensionReceiverArgument + } val checkBuilderInferenceRestriction = !callComponents.languageVersionSettings .supportsFeature(LanguageFeature.NoBuilderInferenceWithoutAnnotationRestriction) - if (checkBuilderInferenceRestriction) { - var extensionReceiverArgument = resolvedCall.extensionReceiverArgument - if (extensionReceiverArgument == null) { - extensionReceiverArgument = chooseExtensionReceiverCandidate() ?: return - resolvedCall.extensionReceiverArgument = extensionReceiverArgument - } - if (extensionReceiverArgument.receiver.receiverValue.type is StubTypeForBuilderInference) { - addDiagnostic( - StubBuilderInferenceReceiver( - extensionReceiverArgument, - candidateDescriptor.extensionReceiverParameter!! - ) + if (checkBuilderInferenceRestriction && + extensionReceiverArgument.receiver.receiverValue.type is StubTypeForBuilderInference + ) { + addDiagnostic( + StubBuilderInferenceReceiver( + extensionReceiverArgument, + candidateDescriptor.extensionReceiverParameter!! ) - } + ) } checkReceiver( resolvedCall.extensionReceiverArgument, diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/noBuilderInferenceRestrictionReceiverInconsistency.kt b/compiler/testData/diagnostics/tests/inference/builderInference/noBuilderInferenceRestrictionReceiverInconsistency.kt new file mode 100644 index 00000000000..ed20a4017ae --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/builderInference/noBuilderInferenceRestrictionReceiverInconsistency.kt @@ -0,0 +1,15 @@ +// FIR_IDENTICAL +// SKIP_TXT +// WITH_STDLIB +// LANGUAGE: +NoBuilderInferenceWithoutAnnotationRestriction + +class A +class B + +var B.foo: Boolean + get() = true + set(value) {} + +private fun A.bar(b: B) { + b.foo = true +} \ No newline at end of file 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 0c8ec1c888b..f501e3a2a34 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 @@ -14459,6 +14459,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/inference/builderInference/multiLambdaRestrictionDisabled.kt"); } + @Test + @TestMetadata("noBuilderInferenceRestrictionReceiverInconsistency.kt") + public void testNoBuilderInferenceRestrictionReceiverInconsistency() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/builderInference/noBuilderInferenceRestrictionReceiverInconsistency.kt"); + } + @Test @TestMetadata("propertySubstitution.kt") public void testPropertySubstitution() throws Exception {