FE: introduce 2.2-bound language feature around KT-74148/KT-24239 fixes
diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java
index c510963..8835cf8 100644
--- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java
+++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java
@@ -24367,6 +24367,12 @@
       }
 
       @Test
+      @TestMetadata("complexGenericOverrideLegacy.kt")
+      public void testComplexGenericOverrideLegacy() {
+        runTest("compiler/testData/diagnostics/tests/j+k/complexGenericOverrideLegacy.kt");
+      }
+
+      @Test
       @TestMetadata("computeIfAbsentConcurrent.kt")
       public void testComputeIfAbsentConcurrent() {
         runTest("compiler/testData/diagnostics/tests/j+k/computeIfAbsentConcurrent.kt");
@@ -32279,6 +32285,12 @@
       }
 
       @Test
+      @TestMetadata("InheritingJavaClassWithGenericClashInOverrideSignatureLegacy.kt")
+      public void testInheritingJavaClassWithGenericClashInOverrideSignatureLegacy() {
+        runTest("compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericClashInOverrideSignatureLegacy.kt");
+      }
+
+      @Test
       @TestMetadata("InheritingJavaClassWithRawTypeInOverrideSignature.kt")
       public void testInheritingJavaClassWithRawTypeInOverrideSignature() {
         runTest("compiler/testData/diagnostics/tests/override/InheritingJavaClassWithRawTypeInOverrideSignature.kt");
diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFirTestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFirTestdataTestGenerated.java
index ee87245..5b896d6 100644
--- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFirTestdataTestGenerated.java
+++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFirTestdataTestGenerated.java
@@ -4592,6 +4592,12 @@
       }
 
       @Test
+      @TestMetadata("complexGenericOverrideWithRawTypeLegacy.kt")
+      public void testComplexGenericOverrideWithRawTypeLegacy() {
+        runTest("compiler/fir/analysis-tests/testData/resolve/overrides/complexGenericOverrideWithRawTypeLegacy.kt");
+      }
+
+      @Test
       @TestMetadata("genericOverrideWithRawType.kt")
       public void testGenericOverrideWithRawType() {
         runTest("compiler/fir/analysis-tests/testData/resolve/overrides/genericOverrideWithRawType.kt");
diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java
index b4ced89..344e328 100644
--- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java
+++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java
@@ -24367,6 +24367,12 @@
       }
 
       @Test
+      @TestMetadata("complexGenericOverrideLegacy.kt")
+      public void testComplexGenericOverrideLegacy() {
+        runTest("compiler/testData/diagnostics/tests/j+k/complexGenericOverrideLegacy.kt");
+      }
+
+      @Test
       @TestMetadata("computeIfAbsentConcurrent.kt")
       public void testComputeIfAbsentConcurrent() {
         runTest("compiler/testData/diagnostics/tests/j+k/computeIfAbsentConcurrent.kt");
@@ -32279,6 +32285,12 @@
       }
 
       @Test
+      @TestMetadata("InheritingJavaClassWithGenericClashInOverrideSignatureLegacy.kt")
+      public void testInheritingJavaClassWithGenericClashInOverrideSignatureLegacy() {
+        runTest("compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericClashInOverrideSignatureLegacy.kt");
+      }
+
+      @Test
       @TestMetadata("InheritingJavaClassWithRawTypeInOverrideSignature.kt")
       public void testInheritingJavaClassWithRawTypeInOverrideSignature() {
         runTest("compiler/testData/diagnostics/tests/override/InheritingJavaClassWithRawTypeInOverrideSignature.kt");
diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFirTestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFirTestDataTestGenerated.java
index 8225110..c7b08d2 100644
--- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFirTestDataTestGenerated.java
+++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFirTestDataTestGenerated.java
@@ -4592,6 +4592,12 @@
       }
 
       @Test
+      @TestMetadata("complexGenericOverrideWithRawTypeLegacy.kt")
+      public void testComplexGenericOverrideWithRawTypeLegacy() {
+        runTest("compiler/fir/analysis-tests/testData/resolve/overrides/complexGenericOverrideWithRawTypeLegacy.kt");
+      }
+
+      @Test
       @TestMetadata("genericOverrideWithRawType.kt")
       public void testGenericOverrideWithRawType() {
         runTest("compiler/fir/analysis-tests/testData/resolve/overrides/genericOverrideWithRawType.kt");
diff --git a/compiler/fir/analysis-tests/testData/resolve/overrides/complexGenericOverrideWithRawType.kt b/compiler/fir/analysis-tests/testData/resolve/overrides/complexGenericOverrideWithRawType.kt
index 034335d4..bb3ca84 100644
--- a/compiler/fir/analysis-tests/testData/resolve/overrides/complexGenericOverrideWithRawType.kt
+++ b/compiler/fir/analysis-tests/testData/resolve/overrides/complexGenericOverrideWithRawType.kt
@@ -1,4 +1,5 @@
 // RUN_PIPELINE_TILL: BACKEND
+// LANGUAGE: +ProperHandlingOfGenericAndRawTypesInJavaOverrides
 // ISSUE: KT-24239
 
 // FILE: StackJava.java
diff --git a/compiler/fir/analysis-tests/testData/resolve/overrides/complexGenericOverrideWithRawTypeInField.kt b/compiler/fir/analysis-tests/testData/resolve/overrides/complexGenericOverrideWithRawTypeInField.kt
index a78ce3d..e389dff 100644
--- a/compiler/fir/analysis-tests/testData/resolve/overrides/complexGenericOverrideWithRawTypeInField.kt
+++ b/compiler/fir/analysis-tests/testData/resolve/overrides/complexGenericOverrideWithRawTypeInField.kt
@@ -1,4 +1,5 @@
 // RUN_PIPELINE_TILL: BACKEND
+// LANGUAGE: +ProperHandlingOfGenericAndRawTypesInJavaOverrides
 
 // FILE: StackJava.java
 public class StackJava {
diff --git a/compiler/fir/analysis-tests/testData/resolve/overrides/complexGenericOverrideWithRawTypeInProperty.kt b/compiler/fir/analysis-tests/testData/resolve/overrides/complexGenericOverrideWithRawTypeInProperty.kt
index 0636366..25d6e98 100644
--- a/compiler/fir/analysis-tests/testData/resolve/overrides/complexGenericOverrideWithRawTypeInProperty.kt
+++ b/compiler/fir/analysis-tests/testData/resolve/overrides/complexGenericOverrideWithRawTypeInProperty.kt
@@ -1,4 +1,5 @@
 // RUN_PIPELINE_TILL: FRONTEND
+// LANGUAGE: +ProperHandlingOfGenericAndRawTypesInJavaOverrides
 
 // FILE: base.kt
 
diff --git a/compiler/fir/analysis-tests/testData/resolve/overrides/complexGenericOverrideWithRawTypeLegacy.fir.txt b/compiler/fir/analysis-tests/testData/resolve/overrides/complexGenericOverrideWithRawTypeLegacy.fir.txt
new file mode 100644
index 0000000..e64699d
--- /dev/null
+++ b/compiler/fir/analysis-tests/testData/resolve/overrides/complexGenericOverrideWithRawTypeLegacy.fir.txt
@@ -0,0 +1,7 @@
+FILE: test.kt
+    public final class MySubject : R|StackJava.SubjectClass| {
+        public constructor(): R|MySubject| {
+            super<R|StackJava.SubjectClass|>()
+        }
+
+    }
diff --git a/compiler/fir/analysis-tests/testData/resolve/overrides/complexGenericOverrideWithRawTypeLegacy.kt b/compiler/fir/analysis-tests/testData/resolve/overrides/complexGenericOverrideWithRawTypeLegacy.kt
new file mode 100644
index 0000000..e3f7a5c
--- /dev/null
+++ b/compiler/fir/analysis-tests/testData/resolve/overrides/complexGenericOverrideWithRawTypeLegacy.kt
@@ -0,0 +1,19 @@
+// RUN_PIPELINE_TILL: BACKEND
+// LANGUAGE: -ProperHandlingOfGenericAndRawTypesInJavaOverrides
+// ISSUE: KT-24239
+
+// FILE: StackJava.java
+public class StackJava {
+    interface AnyGeneric<T> {}
+    interface KeyFace {
+        <T extends AnyGeneric<?>> void anyMethod(AnyGeneric<T> p);
+    }
+    interface NextFace<T extends KeyClass> extends KeyFace {}
+    public abstract static class KeyClass implements KeyFace {
+        @Override public <T extends AnyGeneric<?>> void anyMethod(AnyGeneric<T> p) {}
+    }
+    public static class SubjectClass extends KeyClass implements /* raw */ NextFace {}
+}
+
+// FILE: test.kt
+class MySubject : StackJava.SubjectClass()
diff --git a/compiler/fir/analysis-tests/testData/resolve/overrides/genericOverrideWithRawType.kt b/compiler/fir/analysis-tests/testData/resolve/overrides/genericOverrideWithRawType.kt
index f6e428a..2f67e4a 100644
--- a/compiler/fir/analysis-tests/testData/resolve/overrides/genericOverrideWithRawType.kt
+++ b/compiler/fir/analysis-tests/testData/resolve/overrides/genericOverrideWithRawType.kt
@@ -1,4 +1,5 @@
 // RUN_PIPELINE_TILL: BACKEND
+// LANGUAGE: +ProperHandlingOfGenericAndRawTypesInJavaOverrides
 // SCOPE_DUMP: D:foo
 // FILE: A.java
 public interface A<T> {
diff --git a/compiler/fir/analysis-tests/testData/resolve/overrides/genericOverrideWithRawType2.kt b/compiler/fir/analysis-tests/testData/resolve/overrides/genericOverrideWithRawType2.kt
index 534b88d..0172477 100644
--- a/compiler/fir/analysis-tests/testData/resolve/overrides/genericOverrideWithRawType2.kt
+++ b/compiler/fir/analysis-tests/testData/resolve/overrides/genericOverrideWithRawType2.kt
@@ -1,4 +1,5 @@
 // RUN_PIPELINE_TILL: BACKEND
+// LANGUAGE: +ProperHandlingOfGenericAndRawTypesInJavaOverrides
 // SCOPE_DUMP: D:foo
 // FILE: A.java
 public interface A<T> {
diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeDiagnosticsWithLatestLanguageVersionTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeDiagnosticsWithLatestLanguageVersionTestGenerated.java
index c9b52d9..ed1c00e 100644
--- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeDiagnosticsWithLatestLanguageVersionTestGenerated.java
+++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeDiagnosticsWithLatestLanguageVersionTestGenerated.java
@@ -4630,6 +4630,12 @@
       }
 
       @Test
+      @TestMetadata("complexGenericOverrideWithRawTypeLegacy.kt")
+      public void testComplexGenericOverrideWithRawTypeLegacy() {
+        runTest("compiler/fir/analysis-tests/testData/resolve/overrides/complexGenericOverrideWithRawTypeLegacy.kt");
+      }
+
+      @Test
       @TestMetadata("genericOverrideWithRawType.kt")
       public void testGenericOverrideWithRawType() {
         runTest("compiler/fir/analysis-tests/testData/resolve/overrides/genericOverrideWithRawType.kt");
diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsWithLatestLanguageVersionTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsWithLatestLanguageVersionTestGenerated.java
index 7c217bc..310c16e 100644
--- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsWithLatestLanguageVersionTestGenerated.java
+++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsWithLatestLanguageVersionTestGenerated.java
@@ -24361,6 +24361,12 @@
       }
 
       @Test
+      @TestMetadata("complexGenericOverrideLegacy.kt")
+      public void testComplexGenericOverrideLegacy() {
+        runTest("compiler/testData/diagnostics/tests/j+k/complexGenericOverrideLegacy.kt");
+      }
+
+      @Test
       @TestMetadata("computeIfAbsentConcurrent.kt")
       public void testComputeIfAbsentConcurrent() {
         runTest("compiler/testData/diagnostics/tests/j+k/computeIfAbsentConcurrent.kt");
@@ -29461,6 +29467,12 @@
       }
 
       @Test
+      @TestMetadata("InheritingJavaClassWithGenericClashInOverrideSignatureLegacy.kt")
+      public void testInheritingJavaClassWithGenericClashInOverrideSignatureLegacy() {
+        runTest("compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericClashInOverrideSignatureLegacy.kt");
+      }
+
+      @Test
       @TestMetadata("InheritingJavaClassWithRawTypeInOverrideSignature.kt")
       public void testInheritingJavaClassWithRawTypeInOverrideSignature() {
         runTest("compiler/testData/diagnostics/tests/override/InheritingJavaClassWithRawTypeInOverrideSignature.kt");
diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/PhasedJvmDiagnosticLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/PhasedJvmDiagnosticLightTreeTestGenerated.java
index 0973282..7376b15 100644
--- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/PhasedJvmDiagnosticLightTreeTestGenerated.java
+++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/PhasedJvmDiagnosticLightTreeTestGenerated.java
@@ -23497,6 +23497,12 @@
       }
 
       @Test
+      @TestMetadata("complexGenericOverrideLegacy.kt")
+      public void testComplexGenericOverrideLegacy() {
+        runTest("compiler/testData/diagnostics/tests/j+k/complexGenericOverrideLegacy.kt");
+      }
+
+      @Test
       @TestMetadata("computeIfAbsentConcurrent.kt")
       public void testComputeIfAbsentConcurrent() {
         runTest("compiler/testData/diagnostics/tests/j+k/computeIfAbsentConcurrent.kt");
@@ -31070,6 +31076,12 @@
       }
 
       @Test
+      @TestMetadata("InheritingJavaClassWithGenericClashInOverrideSignatureLegacy.kt")
+      public void testInheritingJavaClassWithGenericClashInOverrideSignatureLegacy() {
+        runTest("compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericClashInOverrideSignatureLegacy.kt");
+      }
+
+      @Test
       @TestMetadata("InheritingJavaClassWithRawTypeInOverrideSignature.kt")
       public void testInheritingJavaClassWithRawTypeInOverrideSignature() {
         runTest("compiler/testData/diagnostics/tests/override/InheritingJavaClassWithRawTypeInOverrideSignature.kt");
@@ -53689,6 +53701,12 @@
       }
 
       @Test
+      @TestMetadata("complexGenericOverrideWithRawTypeLegacy.kt")
+      public void testComplexGenericOverrideWithRawTypeLegacy() {
+        runTest("compiler/fir/analysis-tests/testData/resolve/overrides/complexGenericOverrideWithRawTypeLegacy.kt");
+      }
+
+      @Test
       @TestMetadata("genericOverrideWithRawType.kt")
       public void testGenericOverrideWithRawType() {
         runTest("compiler/fir/analysis-tests/testData/resolve/overrides/genericOverrideWithRawType.kt");
diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/PhasedJvmDiagnosticPsiTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/PhasedJvmDiagnosticPsiTestGenerated.java
index dd6fd0a..59b2b260 100644
--- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/PhasedJvmDiagnosticPsiTestGenerated.java
+++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/PhasedJvmDiagnosticPsiTestGenerated.java
@@ -23503,6 +23503,12 @@
       }
 
       @Test
+      @TestMetadata("complexGenericOverrideLegacy.kt")
+      public void testComplexGenericOverrideLegacy() {
+        runTest("compiler/testData/diagnostics/tests/j+k/complexGenericOverrideLegacy.kt");
+      }
+
+      @Test
       @TestMetadata("computeIfAbsentConcurrent.kt")
       public void testComputeIfAbsentConcurrent() {
         runTest("compiler/testData/diagnostics/tests/j+k/computeIfAbsentConcurrent.kt");
@@ -31065,6 +31071,12 @@
       }
 
       @Test
+      @TestMetadata("InheritingJavaClassWithGenericClashInOverrideSignatureLegacy.kt")
+      public void testInheritingJavaClassWithGenericClashInOverrideSignatureLegacy() {
+        runTest("compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericClashInOverrideSignatureLegacy.kt");
+      }
+
+      @Test
       @TestMetadata("InheritingJavaClassWithRawTypeInOverrideSignature.kt")
       public void testInheritingJavaClassWithRawTypeInOverrideSignature() {
         runTest("compiler/testData/diagnostics/tests/override/InheritingJavaClassWithRawTypeInOverrideSignature.kt");
@@ -53805,6 +53817,12 @@
       }
 
       @Test
+      @TestMetadata("complexGenericOverrideWithRawTypeLegacy.kt")
+      public void testComplexGenericOverrideWithRawTypeLegacy() {
+        runTest("compiler/fir/analysis-tests/testData/resolve/overrides/complexGenericOverrideWithRawTypeLegacy.kt");
+      }
+
+      @Test
       @TestMetadata("genericOverrideWithRawType.kt")
       public void testGenericOverrideWithRawType() {
         runTest("compiler/fir/analysis-tests/testData/resolve/overrides/genericOverrideWithRawType.kt");
diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt
index d0aeff2..10cc4d6 100644
--- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt
+++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassSubstitutionScope.kt
@@ -5,6 +5,7 @@
 
 package org.jetbrains.kotlin.fir.scopes.impl
 
+import org.jetbrains.kotlin.config.LanguageFeature
 import org.jetbrains.kotlin.descriptors.Visibilities
 import org.jetbrains.kotlin.fir.FirSession
 import org.jetbrains.kotlin.fir.FirSessionComponent
@@ -15,6 +16,7 @@
 import org.jetbrains.kotlin.fir.declarations.utils.visibility
 import org.jetbrains.kotlin.fir.dispatchReceiverClassLookupTagOrNull
 import org.jetbrains.kotlin.fir.getContainingClassLookupTag
+import org.jetbrains.kotlin.fir.languageVersionSettings
 import org.jetbrains.kotlin.fir.originalForSubstitutionOverride
 import org.jetbrains.kotlin.fir.resolve.ScopeSession
 import org.jetbrains.kotlin.fir.resolve.ScopeSessionKey
@@ -61,7 +63,10 @@
 
     override fun processFunctionsByName(name: Name, processor: (FirNamedFunctionSymbol) -> Unit) {
         useSiteMemberScope.processFunctionsByName(name) process@{ original ->
-            val function = if (rawClassSymbol != null && !original.dependsOnRawClassSymbol()) {
+            val function = if (rawClassSymbol != null &&
+                session.languageVersionSettings.supportsFeature(LanguageFeature.ProperHandlingOfGenericAndRawTypesInJavaOverrides) &&
+                !original.dependsOnRawClassSymbol()
+            ) {
                 original
             } else {
                 substitutionOverrideCache.overridesForFunctions.getValue(original, this)
diff --git a/compiler/testData/diagnostics/tests/j+k/complexGenericOverride.fir.kt b/compiler/testData/diagnostics/tests/j+k/complexGenericOverride.fir.kt
index 914b396..da88440 100644
--- a/compiler/testData/diagnostics/tests/j+k/complexGenericOverride.fir.kt
+++ b/compiler/testData/diagnostics/tests/j+k/complexGenericOverride.fir.kt
@@ -1,4 +1,5 @@
 // RUN_PIPELINE_TILL: FRONTEND
+// LANGUAGE: +ProperHandlingOfGenericAndRawTypesInJavaOverrides
 // ISSUE: KT-24239
 
 // FILE: StackJava.java
diff --git a/compiler/testData/diagnostics/tests/j+k/complexGenericOverride.kt b/compiler/testData/diagnostics/tests/j+k/complexGenericOverride.kt
index d46737d..55da2ca 100644
--- a/compiler/testData/diagnostics/tests/j+k/complexGenericOverride.kt
+++ b/compiler/testData/diagnostics/tests/j+k/complexGenericOverride.kt
@@ -1,4 +1,5 @@
 // RUN_PIPELINE_TILL: FRONTEND
+// LANGUAGE: +ProperHandlingOfGenericAndRawTypesInJavaOverrides
 // ISSUE: KT-24239
 
 // FILE: StackJava.java
diff --git a/compiler/testData/diagnostics/tests/j+k/complexGenericOverrideLegacy.fir.kt b/compiler/testData/diagnostics/tests/j+k/complexGenericOverrideLegacy.fir.kt
new file mode 100644
index 0000000..84f3232
--- /dev/null
+++ b/compiler/testData/diagnostics/tests/j+k/complexGenericOverrideLegacy.fir.kt
@@ -0,0 +1,38 @@
+// RUN_PIPELINE_TILL: FRONTEND
+// LANGUAGE: -ProperHandlingOfGenericAndRawTypesInJavaOverrides
+// ISSUE: KT-24239
+
+// FILE: StackJava.java
+public class StackJava {
+    interface AnyGeneric<T> {}
+    interface KeyFace {
+        <F extends AnyGeneric<?>> void anyMethod(AnyGeneric<F> p);
+    }
+    interface NextFace<N extends KeyClass> extends KeyFace {
+        <N extends AnyGeneric<?>> void bar(AnyGeneric<N> p);
+    }
+    public abstract static class KeyClass implements KeyFace {
+        @Override public <C extends AnyGeneric<?>> void anyMethod(AnyGeneric<C> p) {}
+    }
+
+    public static class Some implements AnyGeneric<Some> {}
+    public static class Another implements AnyGeneric<Another> {}
+    public static class Incorrect implements AnyGeneric<String> {}
+
+    public static class SubjectClass extends KeyClass implements NextFace {
+        @Override public <S extends AnyGeneric<?>> void bar(AnyGeneric<S> p) {}
+    }
+}
+
+// FILE: test.kt
+class MySubject : StackJava.SubjectClass() {
+    fun foo() {
+        this.anyMethod<StackJava.Some>(StackJava.Some());
+        this.anyMethod<StackJava.Some>(<!ARGUMENT_TYPE_MISMATCH!>StackJava.Another()<!>);
+        this.anyMethod<StackJava.Some>(<!ARGUMENT_TYPE_MISMATCH!>StackJava.Incorrect()<!>);
+        this.<!CANNOT_INFER_PARAMETER_TYPE!>anyMethod<!>(<!ARGUMENT_TYPE_MISMATCH!>StackJava.Incorrect()<!>)
+        this.<!CANNOT_INFER_PARAMETER_TYPE!>bar<!>(<!ARGUMENT_TYPE_MISMATCH!>StackJava.Incorrect()<!>)
+        this.anyMethod<StackJava.Incorrect>(<!ARGUMENT_TYPE_MISMATCH!>StackJava.Incorrect()<!>)
+        this.bar<StackJava.Incorrect>(<!ARGUMENT_TYPE_MISMATCH!>StackJava.Incorrect()<!>)
+    }
+}
diff --git a/compiler/testData/diagnostics/tests/j+k/complexGenericOverrideLegacy.kt b/compiler/testData/diagnostics/tests/j+k/complexGenericOverrideLegacy.kt
new file mode 100644
index 0000000..b1d30c5
--- /dev/null
+++ b/compiler/testData/diagnostics/tests/j+k/complexGenericOverrideLegacy.kt
@@ -0,0 +1,38 @@
+// RUN_PIPELINE_TILL: FRONTEND
+// LANGUAGE: -ProperHandlingOfGenericAndRawTypesInJavaOverrides
+// ISSUE: KT-24239
+
+// FILE: StackJava.java
+public class StackJava {
+    interface AnyGeneric<T> {}
+    interface KeyFace {
+        <F extends AnyGeneric<?>> void anyMethod(AnyGeneric<F> p);
+    }
+    interface NextFace<N extends KeyClass> extends KeyFace {
+        <N extends AnyGeneric<?>> void bar(AnyGeneric<N> p);
+    }
+    public abstract static class KeyClass implements KeyFace {
+        @Override public <C extends AnyGeneric<?>> void anyMethod(AnyGeneric<C> p) {}
+    }
+
+    public static class Some implements AnyGeneric<Some> {}
+    public static class Another implements AnyGeneric<Another> {}
+    public static class Incorrect implements AnyGeneric<String> {}
+
+    public static class SubjectClass extends KeyClass implements NextFace {
+        @Override public <S extends AnyGeneric<?>> void bar(AnyGeneric<S> p) {}
+    }
+}
+
+// FILE: test.kt
+<!ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED!>class MySubject<!> : StackJava.SubjectClass() {
+    fun foo() {
+        this.anyMethod<StackJava.Some>(StackJava.Some());
+        this.anyMethod<StackJava.Some>(StackJava.Another());
+        this.anyMethod<StackJava.Some>(StackJava.Incorrect());
+        this.<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>anyMethod<!>(StackJava.Incorrect())
+        this.<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>bar<!>(StackJava.Incorrect())
+        this.anyMethod<StackJava.Incorrect>(StackJava.Incorrect())
+        this.bar<StackJava.Incorrect>(StackJava.Incorrect())
+    }
+}
diff --git a/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericAndRawClashInOverrideSignature.kt b/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericAndRawClashInOverrideSignature.kt
index 7fd4f57..f512751 100644
--- a/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericAndRawClashInOverrideSignature.kt
+++ b/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericAndRawClashInOverrideSignature.kt
@@ -1,5 +1,6 @@
 // FIR_IDENTICAL
 // RUN_PIPELINE_TILL: FRONTEND
+// LANGUAGE: +ProperHandlingOfGenericAndRawTypesInJavaOverrides
 // ISSUE: KT-74148
 // FILE: A.java
 public abstract class A<T> {
diff --git a/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericClashInOverrideSignature.kt b/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericClashInOverrideSignature.kt
index 98ec3aa..b7a437c 100644
--- a/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericClashInOverrideSignature.kt
+++ b/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericClashInOverrideSignature.kt
@@ -1,4 +1,5 @@
 // RUN_PIPELINE_TILL: FRONTEND
+// LANGUAGE: +ProperHandlingOfGenericAndRawTypesInJavaOverrides
 // ISSUE: KT-74148
 // SCOPE_DUMP: C:foo
 // FIR_IDENTICAL
diff --git a/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericClashInOverrideSignature2.kt b/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericClashInOverrideSignature2.kt
index c45658c..6501cd9 100644
--- a/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericClashInOverrideSignature2.kt
+++ b/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericClashInOverrideSignature2.kt
@@ -1,5 +1,6 @@
 // FIR_IDENTICAL
 // RUN_PIPELINE_TILL: FRONTEND
+// LANGUAGE: +ProperHandlingOfGenericAndRawTypesInJavaOverrides
 // ISSUE: KT-74148
 // FILE: A.java
 public abstract class A<T> {
diff --git a/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericClashInOverrideSignature3.kt b/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericClashInOverrideSignature3.kt
index 3d493bb..5ef5024 100644
--- a/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericClashInOverrideSignature3.kt
+++ b/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericClashInOverrideSignature3.kt
@@ -1,5 +1,6 @@
 // FIR_IDENTICAL
 // RUN_PIPELINE_TILL: FRONTEND
+// LANGUAGE: +ProperHandlingOfGenericAndRawTypesInJavaOverrides
 // ISSUE: KT-74148
 // SCOPE_DUMP: C:foo
 // FILE: A.java
diff --git a/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericClashInOverrideSignatureLegacy.fir.kt b/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericClashInOverrideSignatureLegacy.fir.kt
new file mode 100644
index 0000000..7c7f43e
--- /dev/null
+++ b/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericClashInOverrideSignatureLegacy.fir.kt
@@ -0,0 +1,18 @@
+// RUN_PIPELINE_TILL: BACKEND
+// LANGUAGE: -ProperHandlingOfGenericAndRawTypesInJavaOverrides
+// ISSUE: KT-74148
+// SCOPE_DUMP: C:foo
+// FILE: A.java
+public abstract class A<T> {
+    public abstract Object foo(A<Object> arg0, T arg1);
+}
+
+// FILE: B.java
+public abstract class B extends A<B> {
+    public Object foo(A<B> arg0, B arg1) {
+        return null;
+    }
+}
+
+// FILE: Main.kt
+class C : B()
diff --git a/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericClashInOverrideSignatureLegacy.fir.overrides.txt b/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericClashInOverrideSignatureLegacy.fir.overrides.txt
new file mode 100644
index 0000000..2400046
--- /dev/null
+++ b/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericClashInOverrideSignatureLegacy.fir.overrides.txt
@@ -0,0 +1,5 @@
+C:
+  [Enhancement]: public open fun foo(arg0: R|ft<A<B!>, A<B!>?>|, arg1: R|B!|): R|kotlin/Any!| from Use site scope of /C [id: 0]
+    [Enhancement]: public open fun foo(arg0: R|ft<A<B!>, A<B!>?>|, arg1: R|B!|): R|kotlin/Any!| from Java enhancement scope for /B [id: 0]
+      [SubstitutionOverride(DeclarationSite)]: public abstract override fun foo(arg0: R|ft<A<kotlin/Any!>, A<kotlin/Any!>?>|, arg1: R|B!|): R|kotlin/Any!| from Substitution scope for [Java enhancement scope for /A] for type B [id: 1]
+        [Enhancement]: public abstract fun foo(arg0: R|ft<A<kotlin/Any!>, A<kotlin/Any!>?>|, arg1: R|T!|): R|kotlin/Any!| from Java enhancement scope for /A [id: 2]
diff --git a/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericClashInOverrideSignatureLegacy.kt b/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericClashInOverrideSignatureLegacy.kt
new file mode 100644
index 0000000..63650f7
--- /dev/null
+++ b/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericClashInOverrideSignatureLegacy.kt
@@ -0,0 +1,18 @@
+// RUN_PIPELINE_TILL: BACKEND
+// LANGUAGE: -ProperHandlingOfGenericAndRawTypesInJavaOverrides
+// ISSUE: KT-74148
+// SCOPE_DUMP: C:foo
+// FILE: A.java
+public abstract class A<T> {
+    public abstract Object foo(A<Object> arg0, T arg1);
+}
+
+// FILE: B.java
+public abstract class B extends A<B> {
+    public Object foo(A<B> arg0, B arg1) {
+        return null;
+    }
+}
+
+// FILE: Main.kt
+<!ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED!>class C<!> : B()
diff --git a/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithRawTypeInOverrideSignature.fir.kt b/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithRawTypeInOverrideSignature.fir.kt
index 16d2adf..7aba145 100644
--- a/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithRawTypeInOverrideSignature.fir.kt
+++ b/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithRawTypeInOverrideSignature.fir.kt
@@ -1,4 +1,5 @@
 // RUN_PIPELINE_TILL: BACKEND
+// LANGUAGE: +ProperHandlingOfGenericAndRawTypesInJavaOverrides
 // ISSUE: KT-55822
 // FILE: A.java
 import java.util.List;
diff --git a/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithRawTypeInOverrideSignature.kt b/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithRawTypeInOverrideSignature.kt
index c02b5e9..f5f39f8 100644
--- a/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithRawTypeInOverrideSignature.kt
+++ b/compiler/testData/diagnostics/tests/override/InheritingJavaClassWithRawTypeInOverrideSignature.kt
@@ -1,4 +1,5 @@
 // RUN_PIPELINE_TILL: BACKEND
+// LANGUAGE: +ProperHandlingOfGenericAndRawTypesInJavaOverrides
 // ISSUE: KT-55822
 // FILE: A.java
 import java.util.List;
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 1bc57d4..18ecdf9 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
@@ -24367,6 +24367,12 @@
       }
 
       @Test
+      @TestMetadata("complexGenericOverrideLegacy.kt")
+      public void testComplexGenericOverrideLegacy() {
+        runTest("compiler/testData/diagnostics/tests/j+k/complexGenericOverrideLegacy.kt");
+      }
+
+      @Test
       @TestMetadata("computeIfAbsentConcurrent.kt")
       public void testComputeIfAbsentConcurrent() {
         runTest("compiler/testData/diagnostics/tests/j+k/computeIfAbsentConcurrent.kt");
@@ -32295,6 +32301,12 @@
       }
 
       @Test
+      @TestMetadata("InheritingJavaClassWithGenericClashInOverrideSignatureLegacy.kt")
+      public void testInheritingJavaClassWithGenericClashInOverrideSignatureLegacy() {
+        runTest("compiler/testData/diagnostics/tests/override/InheritingJavaClassWithGenericClashInOverrideSignatureLegacy.kt");
+      }
+
+      @Test
       @TestMetadata("InheritingJavaClassWithRawTypeInOverrideSignature.kt")
       public void testInheritingJavaClassWithRawTypeInOverrideSignature() {
         runTest("compiler/testData/diagnostics/tests/override/InheritingJavaClassWithRawTypeInOverrideSignature.kt");