K1: add diagnostic BUILDER_INFERENCE_STUB_RECEIVER

It's reported on receivers in extension function calls with stub type,
as such calls can shadow members of finalized stub types causing
change of resolve when corresponding type argument specified explicitly

It works by checking extension receiver during call resolution parts run
That way we can easily detect if we found an extension applicable to
stub receiver and report call diagnostic for it

KT-53739
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 970c5c6..e85e9d3 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
@@ -14625,6 +14625,18 @@
                     public void testRenderingStubTypes() throws Exception {
                         runTest("compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/renderingStubTypes.kt");
                     }
+
+                    @Test
+                    @TestMetadata("stubTypeReceiverRestriction.kt")
+                    public void testStubTypeReceiverRestriction() throws Exception {
+                        runTest("compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/stubTypeReceiverRestriction.kt");
+                    }
+
+                    @Test
+                    @TestMetadata("stubTypeReceiverRestrictionDisabled.kt")
+                    public void testStubTypeReceiverRestrictionDisabled() throws Exception {
+                        runTest("compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/stubTypeReceiverRestrictionDisabled.kt");
+                    }
                 }
             }
 
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 0004dac..b509f0e 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
@@ -14625,6 +14625,18 @@
                     public void testRenderingStubTypes() throws Exception {
                         runTest("compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/renderingStubTypes.kt");
                     }
+
+                    @Test
+                    @TestMetadata("stubTypeReceiverRestriction.kt")
+                    public void testStubTypeReceiverRestriction() throws Exception {
+                        runTest("compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/stubTypeReceiverRestriction.kt");
+                    }
+
+                    @Test
+                    @TestMetadata("stubTypeReceiverRestrictionDisabled.kt")
+                    public void testStubTypeReceiverRestrictionDisabled() throws Exception {
+                        runTest("compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/stubTypeReceiverRestrictionDisabled.kt");
+                    }
                 }
             }
 
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 0a20c57..22ae96e 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
@@ -14625,6 +14625,18 @@
                     public void testRenderingStubTypes() throws Exception {
                         runTest("compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/renderingStubTypes.kt");
                     }
+
+                    @Test
+                    @TestMetadata("stubTypeReceiverRestriction.kt")
+                    public void testStubTypeReceiverRestriction() throws Exception {
+                        runTest("compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/stubTypeReceiverRestriction.kt");
+                    }
+
+                    @Test
+                    @TestMetadata("stubTypeReceiverRestrictionDisabled.kt")
+                    public void testStubTypeReceiverRestrictionDisabled() throws Exception {
+                        runTest("compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/stubTypeReceiverRestrictionDisabled.kt");
+                    }
                 }
             }
 
diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java
index 7664f60..36e3ddf 100644
--- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java
+++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java
@@ -862,6 +862,7 @@
     DiagnosticFactory3<PsiElement, KotlinType, String, String> STUB_TYPE_IN_ARGUMENT_CAUSES_AMBIGUITY = DiagnosticFactory3.create(ERROR);
     DiagnosticFactory4<PsiElement, KotlinType, String, String, BuilderLambdaLabelingInfo> STUB_TYPE_IN_RECEIVER_CAUSES_AMBIGUITY = DiagnosticFactory4.create(ERROR);
     DiagnosticFactory2<PsiElement, Name, Name> BUILDER_INFERENCE_MULTI_LAMBDA_RESTRICTION = DiagnosticFactory2.create(ERROR);
+    DiagnosticFactory2<PsiElement, Name, Name> BUILDER_INFERENCE_STUB_RECEIVER = DiagnosticFactory2.create(ERROR);
 
     DiagnosticFactory1<PsiElement, Collection<? extends ResolvedCall<?>>> NONE_APPLICABLE = DiagnosticFactory1.create(ERROR);
     DiagnosticFactory1<PsiElement, Collection<? extends ResolvedCall<?>>> CANNOT_COMPLETE_RESOLVE = DiagnosticFactory1.create(ERROR);
diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java
index 1c9decc..329347d 100644
--- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java
+++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java
@@ -945,6 +945,7 @@
         MAP.put(STUB_TYPE_IN_ARGUMENT_CAUSES_AMBIGUITY, "The type of an argument hasn''t been inferred yet. To disambiguate this call, explicitly cast it to `{0}` if you want the builder''s type parameter(s) `{1}` to be inferred to `{2}`.", RENDER_TYPE, STRING, STRING);
         MAP.put(STUB_TYPE_IN_RECEIVER_CAUSES_AMBIGUITY, "The type of a receiver hasn''t been inferred yet. To disambiguate this call, explicitly cast it to `{0}` if you want the builder''s type parameter(s) `{1}` to be inferred to `{2}`.", RENDER_TYPE, STRING, STRING, null);
         MAP.put(BUILDER_INFERENCE_MULTI_LAMBDA_RESTRICTION, "Unstable inference behaviour with multiple lambdas. Please either specify type argument for generic parameter `{0}` of `{1}` explicitly or add @BuilderInference to corresponding parameter declaration", TO_STRING, TO_STRING);
+        MAP.put(BUILDER_INFERENCE_STUB_RECEIVER, "The type of a receiver hasn''t been inferred yet. Please specify type argument for generic parameter `{0}` of `{1}` explicitly", TO_STRING, TO_STRING);
         MAP.put(NONE_APPLICABLE, "None of the following functions can be called with the arguments supplied: {0}", AMBIGUOUS_CALLS);
         MAP.put(CANNOT_COMPLETE_RESOLVE, "Cannot choose among the following candidates without completing type inference: {0}", AMBIGUOUS_CALLS);
         MAP.put(UNRESOLVED_REFERENCE_WRONG_RECEIVER, "Unresolved reference. None of the following candidates is applicable because of receiver type mismatch: {0}", AMBIGUOUS_CALLS);
diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt
index cd7edad..9b57556 100644
--- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt
+++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt
@@ -39,6 +39,7 @@
 import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver
 import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor
 import org.jetbrains.kotlin.types.KotlinType
+import org.jetbrains.kotlin.types.StubTypeForBuilderInference
 import org.jetbrains.kotlin.types.TypeUtils
 import org.jetbrains.kotlin.types.checker.intersectWrappedTypes
 import org.jetbrains.kotlin.types.error.ErrorUtils
@@ -199,6 +200,21 @@
                     trace.report(SUPER_CANT_BE_EXTENSION_RECEIVER.on(psiExpression, psiExpression.text))
                 }
             }
+
+            StubBuilderInferenceReceiver::class.java -> {
+                diagnostic as StubBuilderInferenceReceiver
+
+                val stubType = callReceiver.receiver.receiverValue.type as? StubTypeForBuilderInference
+                val originalTypeParameter = stubType?.originalTypeVariable?.originalTypeParameter
+
+                trace.report(
+                    BUILDER_INFERENCE_STUB_RECEIVER.on(
+                        callReceiver.psiExpression ?: call.callElement,
+                        originalTypeParameter?.name ?: SpecialNames.NO_NAME_PROVIDED,
+                        originalTypeParameter?.containingDeclaration?.name ?: SpecialNames.NO_NAME_PROVIDED
+                    )
+                )
+            }
         }
     }
 
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 2d172f6..d45efcd 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
@@ -661,9 +661,25 @@
                 candidateDescriptor.dispatchReceiverParameter,
                 shouldCheckImplicitInvoke = true,
             )
+
             1 -> {
-                if (resolvedCall.extensionReceiverArgument == null) {
-                    resolvedCall.extensionReceiverArgument = chooseExtensionReceiverCandidate() ?: return
+                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!!
+                            )
+                        )
+                    }
                 }
                 checkReceiver(
                     resolvedCall.extensionReceiverArgument,
diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinCallDiagnostics.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinCallDiagnostics.kt
index 2846208..11878bb 100644
--- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinCallDiagnostics.kt
+++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinCallDiagnostics.kt
@@ -73,6 +73,13 @@
     override fun report(reporter: DiagnosticReporter) = reporter.onCallArgument(argument, this)
 }
 
+class StubBuilderInferenceReceiver(
+    val receiver: SimpleKotlinCallArgument,
+    val extensionReceiverParameter: ReceiverParameterDescriptor,
+) : KotlinCallDiagnostic(RESOLVED) {
+    override fun report(reporter: DiagnosticReporter) = reporter.onCallReceiver(receiver, this)
+}
+
 class MixingNamedAndPositionArguments(override val argument: KotlinCallArgument) : InapplicableArgumentDiagnostic()
 
 class NamedArgumentNotAllowed(val argument: KotlinCallArgument, val descriptor: CallableDescriptor) : KotlinCallDiagnostic(INAPPLICABLE) {
diff --git a/compiler/testData/codegen/box/inference/builderInference/memberScope.kt b/compiler/testData/codegen/box/inference/builderInference/memberScope.kt
index 42d2b17..1c33204 100644
--- a/compiler/testData/codegen/box/inference/builderInference/memberScope.kt
+++ b/compiler/testData/codegen/box/inference/builderInference/memberScope.kt
@@ -20,9 +20,10 @@
     val ret = build {
         emit(1)
         emit(null)
-        get()?.test()
-        get()?.test2()
-        get().test2()
+        // Error, resolved to extension on stub receiver
+//        get()?.test()
+//        get()?.test2()
+//        get().test2()
         get()?.hashCode()
         get()?.equals(1)
         val x = get()
@@ -38,9 +39,10 @@
             x.equals("")
             x.hashCode()
             x.toString()
-            x.test()
-            x?.test2()
-            x.test2()
+            // Error, resolved to extension on stub receiver
+//            x.test()
+//            x?.test2()
+//            x.test2()
         }
 
         if (x == null) {
@@ -50,8 +52,9 @@
 //            x.hashCode()
 //            x.toString()
 //            x.test()
-            x?.test2()
-            x.test2()
+            // Error, resolved to extension on stub receiver
+//            x?.test2()
+//            x.test2()
         }
 
         if (x === null) {
@@ -61,8 +64,9 @@
 //            x.hashCode()
 //            x.toString()
 //            x.test()
-            x?.test2()
-            x.test2()
+            // Error, resolved to extension on stub receiver
+//            x?.test2()
+//            x.test2()
         }
 
         ""
diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/errorOnStubReceiver.kt b/compiler/testData/diagnostics/tests/inference/builderInference/errorOnStubReceiver.kt
index 655a98e..38e5002 100644
--- a/compiler/testData/diagnostics/tests/inference/builderInference/errorOnStubReceiver.kt
+++ b/compiler/testData/diagnostics/tests/inference/builderInference/errorOnStubReceiver.kt
@@ -12,7 +12,7 @@
 
     buildList {
         add(Bar())
-        this.get(0).test() // resolved to Any?.test
+        <!BUILDER_INFERENCE_STUB_RECEIVER!>this.get(0)<!>.test() // resolved to Any?.test
     }
     buildList<Bar> {
         add(Bar())
diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/kt53422.fir.kt b/compiler/testData/diagnostics/tests/inference/builderInference/kt53422.fir.kt
index 5ec0bf5..8a84de7 100644
--- a/compiler/testData/diagnostics/tests/inference/builderInference/kt53422.fir.kt
+++ b/compiler/testData/diagnostics/tests/inference/builderInference/kt53422.fir.kt
@@ -1,4 +1,5 @@
 // WITH_STDLIB
+// SKIP_TXT
 fun test() {
     foo(
         flow { emit(0) }
diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/kt53422.kt b/compiler/testData/diagnostics/tests/inference/builderInference/kt53422.kt
index e2c112f..24f6b4e 100644
--- a/compiler/testData/diagnostics/tests/inference/builderInference/kt53422.kt
+++ b/compiler/testData/diagnostics/tests/inference/builderInference/kt53422.kt
@@ -3,7 +3,7 @@
 fun test() {
     foo(
         flow { emit(0) }
-    ) <!BUILDER_INFERENCE_MULTI_LAMBDA_RESTRICTION!>{ it.collect <!TOO_MANY_ARGUMENTS!>{}<!> }<!>
+    ) <!BUILDER_INFERENCE_MULTI_LAMBDA_RESTRICTION!>{ <!BUILDER_INFERENCE_STUB_RECEIVER!>it<!>.collect <!TOO_MANY_ARGUMENTS!>{}<!> }<!>
 
     // 0. Initial
     // W <: Any / declared upper bound
diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/memberScope.kt b/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/memberScope.kt
index 821f280..c13790a 100644
--- a/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/memberScope.kt
+++ b/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/memberScope.kt
@@ -20,9 +20,9 @@
     val ret1 = build {
         emit(1)
         emit(null)
-        get()?.test()
-        get()?.test2()
-        get().test2()
+        <!BUILDER_INFERENCE_STUB_RECEIVER!>get()<!>?.test()
+        <!BUILDER_INFERENCE_STUB_RECEIVER!>get()<!>?.test2()
+        <!BUILDER_INFERENCE_STUB_RECEIVER!>get()<!>.test2()
         get()?.hashCode()
         get()?.equals(1)
         // there is `String?.equals` extension
@@ -31,9 +31,9 @@
     val ret2 = build {
         emit(1)
         emit(null)
-        get()?.test()
-        get()?.test2()
-        get().test2()
+        <!BUILDER_INFERENCE_STUB_RECEIVER!>get()<!>?.test()
+        <!BUILDER_INFERENCE_STUB_RECEIVER!>get()<!>?.test2()
+        <!BUILDER_INFERENCE_STUB_RECEIVER!>get()<!>.test2()
         get()?.hashCode()
         get()?.equals(1)
         val x = get()
@@ -44,9 +44,9 @@
     val ret3 = build {
         emit(1)
         emit(null)
-        get()?.test()
-        get()?.test2()
-        get().test2()
+        <!BUILDER_INFERENCE_STUB_RECEIVER!>get()<!>?.test()
+        <!BUILDER_INFERENCE_STUB_RECEIVER!>get()<!>?.test2()
+        <!BUILDER_INFERENCE_STUB_RECEIVER!>get()<!>.test2()
         get()?.hashCode()
         get()?.equals(1)
         val x = get()
@@ -62,9 +62,9 @@
             x.equals("")
             x.hashCode()
             x.toString()
-            x.test()
-            x<!UNNECESSARY_SAFE_CALL!>?.<!>test2()
-            x.test2()
+            <!BUILDER_INFERENCE_STUB_RECEIVER!>x<!>.test()
+            <!BUILDER_INFERENCE_STUB_RECEIVER!>x<!><!UNNECESSARY_SAFE_CALL!>?.<!>test2()
+            <!BUILDER_INFERENCE_STUB_RECEIVER!>x<!>.test2()
         }
 
         ""
@@ -104,7 +104,7 @@
         emit(null)
         val x = get()
         if (x == null) {
-            <!TYPE_MISMATCH("Any; Nothing?")!>x<!>.test()
+            <!BUILDER_INFERENCE_STUB_RECEIVER, TYPE_MISMATCH("Any; Nothing?")!>x<!>.test()
         }
 
         ""
@@ -144,7 +144,7 @@
         emit(null)
         val x = get()
         if (x === null) {
-            <!TYPE_MISMATCH("Any; Nothing?")!>x<!>.test()
+            <!BUILDER_INFERENCE_STUB_RECEIVER, TYPE_MISMATCH("Any; Nothing?")!>x<!>.test()
         }
 
         ""
@@ -153,16 +153,16 @@
         emit(1)
         emit(null)
         val x = get()
-        <!TYPE_MISMATCH("Any; Nothing?")!>x<!>.test()
+        <!BUILDER_INFERENCE_STUB_RECEIVER, TYPE_MISMATCH("Any; Nothing?")!>x<!>.test()
 
         ""
     }
     val ret41 = build {
         emit(1)
         emit(null)
-        get()?.test()
-        get()?.test2()
-        get().test2()
+        <!BUILDER_INFERENCE_STUB_RECEIVER!>get()<!>?.test()
+        <!BUILDER_INFERENCE_STUB_RECEIVER!>get()<!>?.test2()
+        <!BUILDER_INFERENCE_STUB_RECEIVER!>get()<!>.test2()
         get()?.hashCode()
         get()?.equals(1)
         val x = get()
@@ -181,11 +181,11 @@
         }
 
         if (x == null) {
-            <!DEBUG_INFO_CONSTANT!>x<!>?.test2()
+            <!BUILDER_INFERENCE_STUB_RECEIVER, DEBUG_INFO_CONSTANT!>x<!>?.test2()
         }
 
         if (x == null) {
-            x.test2()
+            <!BUILDER_INFERENCE_STUB_RECEIVER!>x<!>.test2()
         }
 
         if (x === null) {
@@ -197,11 +197,11 @@
         }
 
         if (x === null) {
-            <!DEBUG_INFO_CONSTANT!>x<!>?.test2()
+            <!BUILDER_INFERENCE_STUB_RECEIVER, DEBUG_INFO_CONSTANT!>x<!>?.test2()
         }
 
         if (x === null) {
-            x.test2()
+            <!BUILDER_INFERENCE_STUB_RECEIVER!>x<!>.test2()
         }
 
         ""
@@ -239,7 +239,7 @@
         emit(null)
         val x = get()
         if (x == null) {
-            <!TYPE_MISMATCH("Any; Nothing?")!>x<!>.test()
+            <!BUILDER_INFERENCE_STUB_RECEIVER, TYPE_MISMATCH("Any; Nothing?")!>x<!>.test()
         }
         ""
     }
@@ -276,7 +276,7 @@
         emit(null)
         val x = get()
         if (x === null) {
-            <!TYPE_MISMATCH("Any; Nothing?")!>x<!>.test()
+            <!BUILDER_INFERENCE_STUB_RECEIVER, TYPE_MISMATCH("Any; Nothing?")!>x<!>.test()
         }
         ""
     }
@@ -284,15 +284,15 @@
         emit(1)
         emit(null)
         val x = get()
-        <!TYPE_MISMATCH("Any; Nothing?")!>x<!>.test()
+        <!BUILDER_INFERENCE_STUB_RECEIVER, TYPE_MISMATCH("Any; Nothing?")!>x<!>.test()
         ""
     }
     val ret51 = build {
         emit(1)
         emit(null)
-        get()?.test()
-        get()?.test2()
-        get().test2()
+        <!BUILDER_INFERENCE_STUB_RECEIVER!>get()<!>?.test()
+        <!BUILDER_INFERENCE_STUB_RECEIVER!>get()<!>?.test2()
+        <!BUILDER_INFERENCE_STUB_RECEIVER!>get()<!>.test2()
         get()?.hashCode()
         get()?.equals(1)
         val x = get()
@@ -305,8 +305,8 @@
         if (x == null) {
             <!DEBUG_INFO_CONSTANT!>x<!>?.hashCode()
             <!DEBUG_INFO_CONSTANT!>x<!>?.equals(1)
-            <!DEBUG_INFO_CONSTANT!>x<!>?.test2()
-            x.test2()
+            <!BUILDER_INFERENCE_STUB_RECEIVER, DEBUG_INFO_CONSTANT!>x<!>?.test2()
+            <!BUILDER_INFERENCE_STUB_RECEIVER!>x<!>.test2()
         }
 
         ""
diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/stubTypeReceiverRestriction.fir.kt b/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/stubTypeReceiverRestriction.fir.kt
new file mode 100644
index 0000000..0294509
--- /dev/null
+++ b/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/stubTypeReceiverRestriction.fir.kt
@@ -0,0 +1,72 @@
+// WITH_STDLIB
+// SKIP_TXT
+
+fun <R> a(lambda: List<R>.(R) -> Unit) {}
+
+fun <T> T.extension() {}
+
+fun use(p: Any?) {}
+
+fun test1() {
+    <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>a<!> {
+        this.get(0).extension()
+        use(this.get(0)::extension)
+        use(it::extension)
+    }
+}
+
+
+fun test2() {
+    <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>a<!> {
+        val v = this.get(0)
+        v.extension()
+        use(v::extension)
+        use(it::extension)
+    }
+}
+
+fun test3() {
+    operator fun <T> T.getValue(thisRef: Any?, prop: Any?): T = this
+    <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>a<!> {
+        val v by this.get(0)
+        v.extension()
+        use(v::extension)
+        use(it::extension)
+    }
+}
+
+class Box<TIn>(val t: TIn)
+
+fun test4() {
+    operator fun <T> T.provideDelegate(thisRef: Any?, prop: Any?): Box<T> = Box(this)
+    operator fun <T> Box<T>.getValue(thisRef: Any?, prop: Any?): T = this.t
+    <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>a<!> {
+        val v by this.get(0)
+        v.extension()
+        use(v::extension)
+        use(it::extension)
+    }
+}
+
+fun <R> b(lambda: R.(List<R>) -> Unit) {}
+
+fun test5() {
+
+    operator fun <T> T.invoke(): T = this
+    <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>b<!> {
+        extension()
+        this().extension()
+        use(::extension)
+    }
+}
+
+val <T> T.genericLambda: T.((T) -> Unit) -> Unit get() = {}
+
+fun test6() {
+    b {
+        extension()
+        genericLambda { }
+        genericLambda { it.extension() }
+        use(::extension)
+    }
+}
\ No newline at end of file
diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/stubTypeReceiverRestriction.kt b/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/stubTypeReceiverRestriction.kt
new file mode 100644
index 0000000..9444a28
--- /dev/null
+++ b/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/stubTypeReceiverRestriction.kt
@@ -0,0 +1,72 @@
+// WITH_STDLIB
+// SKIP_TXT
+
+fun <R> a(lambda: List<R>.(R) -> Unit) {}
+
+fun <T> T.extension() {}
+
+fun use(p: Any?) {}
+
+fun test1() {
+    <!INFERRED_INTO_DECLARED_UPPER_BOUNDS!>a<!> {
+        <!BUILDER_INFERENCE_STUB_RECEIVER("R; a")!>this.get(0)<!>.extension()
+        use(<!BUILDER_INFERENCE_STUB_RECEIVER("R; a")!>this.get(0)<!>::extension)
+        use(<!BUILDER_INFERENCE_STUB_RECEIVER("R; a")!>it<!>::extension)
+    }
+}
+
+
+fun test2() {
+    <!INFERRED_INTO_DECLARED_UPPER_BOUNDS!>a<!> {
+        val v = this.get(0)
+        <!BUILDER_INFERENCE_STUB_RECEIVER("R; a")!>v<!>.extension()
+        use(<!BUILDER_INFERENCE_STUB_RECEIVER("R; a")!>v<!>::extension)
+        use(<!BUILDER_INFERENCE_STUB_RECEIVER("R; a")!>it<!>::extension)
+    }
+}
+
+fun test3() {
+    operator fun <T> T.getValue(thisRef: Any?, prop: Any?): T = this
+    <!INFERRED_INTO_DECLARED_UPPER_BOUNDS!>a<!> {
+        val v by <!BUILDER_INFERENCE_STUB_RECEIVER("R; a")!>this.get(0)<!>
+        <!BUILDER_INFERENCE_STUB_RECEIVER("R; a")!>v<!>.extension()
+        use(<!BUILDER_INFERENCE_STUB_RECEIVER("R; a")!>v<!>::extension)
+        use(<!BUILDER_INFERENCE_STUB_RECEIVER("R; a")!>it<!>::extension)
+    }
+}
+
+class Box<TIn>(val t: TIn)
+
+fun test4() {
+    operator fun <T> T.provideDelegate(thisRef: Any?, prop: Any?): Box<T> = Box(this)
+    operator fun <T> Box<T>.getValue(thisRef: Any?, prop: Any?): T = this.t
+    <!INFERRED_INTO_DECLARED_UPPER_BOUNDS!>a<!> {
+        val v by <!BUILDER_INFERENCE_STUB_RECEIVER("R; a")!>this.get(0)<!>
+        <!BUILDER_INFERENCE_STUB_RECEIVER("R; a")!>v<!>.extension()
+        use(<!BUILDER_INFERENCE_STUB_RECEIVER("R; a")!>v<!>::extension)
+        use(<!BUILDER_INFERENCE_STUB_RECEIVER("R; a")!>it<!>::extension)
+    }
+}
+
+fun <R> b(lambda: R.(List<R>) -> Unit) {}
+
+fun test5() {
+
+    operator fun <T> T.invoke(): T = this
+    <!INFERRED_INTO_DECLARED_UPPER_BOUNDS!>b<!> {
+        <!BUILDER_INFERENCE_STUB_RECEIVER("R; b")!>extension()<!>
+        <!BUILDER_INFERENCE_STUB_RECEIVER("R; b")!><!BUILDER_INFERENCE_STUB_RECEIVER("R; b")!>this<!>()<!>.extension()
+        <!BUILDER_INFERENCE_STUB_RECEIVER("R; b")!>use(::extension)<!>
+    }
+}
+
+val <T> T.genericLambda: T.((T) -> Unit) -> Unit get() = {}
+
+fun test6() {
+    <!INFERRED_INTO_DECLARED_UPPER_BOUNDS!>b<!> {
+        <!BUILDER_INFERENCE_STUB_RECEIVER("R; b")!>extension()<!>
+        <!BUILDER_INFERENCE_STUB_RECEIVER("R; b")!>genericLambda<!> { }
+        <!BUILDER_INFERENCE_STUB_RECEIVER("R; b")!>genericLambda<!> { <!BUILDER_INFERENCE_STUB_RECEIVER("R; b")!>it<!>.extension() }
+        <!BUILDER_INFERENCE_STUB_RECEIVER("R; b")!>use(::extension)<!>
+    }
+}
\ No newline at end of file
diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/stubTypeReceiverRestrictionDisabled.fir.kt b/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/stubTypeReceiverRestrictionDisabled.fir.kt
new file mode 100644
index 0000000..bd649fb
--- /dev/null
+++ b/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/stubTypeReceiverRestrictionDisabled.fir.kt
@@ -0,0 +1,73 @@
+// WITH_STDLIB
+// LANGUAGE: +NoBuilderInferenceWithoutAnnotationRestriction
+// SKIP_TXT
+
+fun <R> a(lambda: List<R>.(R) -> Unit) {}
+
+fun <T> T.extension() {}
+
+fun use(p: Any?) {}
+
+fun test1() {
+    <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>a<!> {
+        this.get(0).extension()
+        use(this.get(0)::extension)
+        use(it::extension)
+    }
+}
+
+
+fun test2() {
+    <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>a<!> {
+        val v = this.get(0)
+        v.extension()
+        use(v::extension)
+        use(it::extension)
+    }
+}
+
+fun test3() {
+    operator fun <T> T.getValue(thisRef: Any?, prop: Any?): T = this
+    <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>a<!> {
+        val v by this.get(0)
+        v.extension()
+        use(v::extension)
+        use(it::extension)
+    }
+}
+
+class Box<TIn>(val t: TIn)
+
+fun test4() {
+    operator fun <T> T.provideDelegate(thisRef: Any?, prop: Any?): Box<T> = Box(this)
+    operator fun <T> Box<T>.getValue(thisRef: Any?, prop: Any?): T = this.t
+    <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>a<!> {
+        val v by this.get(0)
+        v.extension()
+        use(v::extension)
+        use(it::extension)
+    }
+}
+
+fun <R> b(lambda: R.(List<R>) -> Unit) {}
+
+fun test5() {
+
+    operator fun <T> T.invoke(): T = this
+    <!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>b<!> {
+        extension()
+        this().extension()
+        use(::extension)
+    }
+}
+
+val <T> T.genericLambda: T.((T) -> Unit) -> Unit get() = {}
+
+fun test6() {
+    b {
+        extension()
+        genericLambda { }
+        genericLambda { it.extension() }
+        use(::extension)
+    }
+}
\ No newline at end of file
diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/stubTypeReceiverRestrictionDisabled.kt b/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/stubTypeReceiverRestrictionDisabled.kt
new file mode 100644
index 0000000..38f5c9c
--- /dev/null
+++ b/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/stubTypeReceiverRestrictionDisabled.kt
@@ -0,0 +1,73 @@
+// WITH_STDLIB
+// LANGUAGE: +NoBuilderInferenceWithoutAnnotationRestriction
+// SKIP_TXT
+
+fun <R> a(lambda: List<R>.(R) -> Unit) {}
+
+fun <T> T.extension() {}
+
+fun use(p: Any?) {}
+
+fun test1() {
+    <!INFERRED_INTO_DECLARED_UPPER_BOUNDS!>a<!> {
+        this.get(0).extension()
+        use(this.get(0)::extension)
+        use(it::extension)
+    }
+}
+
+
+fun test2() {
+    <!INFERRED_INTO_DECLARED_UPPER_BOUNDS!>a<!> {
+        val v = this.get(0)
+        v.extension()
+        use(v::extension)
+        use(it::extension)
+    }
+}
+
+fun test3() {
+    operator fun <T> T.getValue(thisRef: Any?, prop: Any?): T = this
+    <!INFERRED_INTO_DECLARED_UPPER_BOUNDS!>a<!> {
+        val v by this.get(0)
+        v.extension()
+        use(v::extension)
+        use(it::extension)
+    }
+}
+
+class Box<TIn>(val t: TIn)
+
+fun test4() {
+    operator fun <T> T.provideDelegate(thisRef: Any?, prop: Any?): Box<T> = Box(this)
+    operator fun <T> Box<T>.getValue(thisRef: Any?, prop: Any?): T = this.t
+    <!INFERRED_INTO_DECLARED_UPPER_BOUNDS!>a<!> {
+        val v by this.get(0)
+        v.extension()
+        use(v::extension)
+        use(it::extension)
+    }
+}
+
+fun <R> b(lambda: R.(List<R>) -> Unit) {}
+
+fun test5() {
+
+    operator fun <T> T.invoke(): T = this
+    <!INFERRED_INTO_DECLARED_UPPER_BOUNDS!>b<!> {
+        extension()
+        this().extension()
+        use(::extension)
+    }
+}
+
+val <T> T.genericLambda: T.((T) -> Unit) -> Unit get() = {}
+
+fun test6() {
+    <!INFERRED_INTO_DECLARED_UPPER_BOUNDS!>b<!> {
+        extension()
+        genericLambda { }
+        genericLambda { it.extension() }
+        use(::extension)
+    }
+}
\ 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 77441d8..2b47bf1 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
@@ -14631,6 +14631,18 @@
                     public void testRenderingStubTypes() throws Exception {
                         runTest("compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/renderingStubTypes.kt");
                     }
+
+                    @Test
+                    @TestMetadata("stubTypeReceiverRestriction.kt")
+                    public void testStubTypeReceiverRestriction() throws Exception {
+                        runTest("compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/stubTypeReceiverRestriction.kt");
+                    }
+
+                    @Test
+                    @TestMetadata("stubTypeReceiverRestrictionDisabled.kt")
+                    public void testStubTypeReceiverRestrictionDisabled() throws Exception {
+                        runTest("compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/stubTypeReceiverRestrictionDisabled.kt");
+                    }
                 }
             }