diff --git a/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java b/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java index d3ae6f1f707..ebddac97c58 100644 --- a/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java +++ b/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java @@ -2701,6 +2701,11 @@ public class LazyBodyIsNotTouchedTilContractsPhaseTestGenerated extends Abstract runTest("compiler/fir/analysis-tests/testData/resolve/overrides/protobufExt.kt"); } + @TestMetadata("sameValueParametersDifferentReceiver.kt") + public void testSameValueParametersDifferentReceiver() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/overrides/sameValueParametersDifferentReceiver.kt"); + } + @TestMetadata("simple.kt") public void testSimple() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/overrides/simple.kt"); diff --git a/compiler/fir/analysis-tests/testData/resolve/overrides/sameValueParametersDifferentReceiver.fir.txt b/compiler/fir/analysis-tests/testData/resolve/overrides/sameValueParametersDifferentReceiver.fir.txt new file mode 100644 index 00000000000..386c61ba39c --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/overrides/sameValueParametersDifferentReceiver.fir.txt @@ -0,0 +1,21 @@ +FILE: sameValueParametersDifferentReceiver.kt + public open class A : R|kotlin/Any| { + public constructor(): R|A| { + super() + } + + public final fun R|kotlin/String|.foo(from: R|kotlin/String|, to: R|kotlin/String|): R|kotlin/Int| { + ^foo Int(1) + } + + public final fun R|T|.foo(from: R|kotlin/String|, to: R|kotlin/String|): R|kotlin/Int| { + ^foo Int(1) + } + + } + public final class B : R|A| { + public constructor(): R|B| { + super() + } + + } diff --git a/compiler/fir/analysis-tests/testData/resolve/overrides/sameValueParametersDifferentReceiver.kt b/compiler/fir/analysis-tests/testData/resolve/overrides/sameValueParametersDifferentReceiver.kt new file mode 100644 index 00000000000..9681e4d89f2 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/overrides/sameValueParametersDifferentReceiver.kt @@ -0,0 +1,11 @@ +open class A { + fun String.foo(from: String, to: String): Int { + return 1 + } + + fun T.foo(from: String, to: String): Int { + return 1 + } +} + +class B : A() diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java index d423c836ddd..a1e3074faa2 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java @@ -3059,6 +3059,12 @@ public class FirDiagnosticTestGenerated extends AbstractFirDiagnosticTest { runTest("compiler/fir/analysis-tests/testData/resolve/overrides/protobufExt.kt"); } + @Test + @TestMetadata("sameValueParametersDifferentReceiver.kt") + public void testSameValueParametersDifferentReceiver() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/overrides/sameValueParametersDifferentReceiver.kt"); + } + @Test @TestMetadata("simple.kt") public void testSimple() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java index 1e761254792..4947280bebc 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java @@ -3059,6 +3059,12 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos runTest("compiler/fir/analysis-tests/testData/resolve/overrides/protobufExt.kt"); } + @Test + @TestMetadata("sameValueParametersDifferentReceiver.kt") + public void testSameValueParametersDifferentReceiver() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/overrides/sameValueParametersDifferentReceiver.kt"); + } + @Test @TestMetadata("simple.kt") public void testSimple() throws Exception { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirImplementationMismatchChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirImplementationMismatchChecker.kt index 851fdc512eb..71a9d7f9ddf 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirImplementationMismatchChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirImplementationMismatchChecker.kt @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.fir.types.ConeTypeCheckerContext import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.types.AbstractTypeChecker +import org.jetbrains.kotlin.utils.addIfNotNull object FirImplementationMismatchChecker : FirClassChecker() { @@ -182,6 +183,7 @@ object FirImplementationMismatchChecker : FirClassChecker() { reporter.reportOn(containingClass.source, FirErrors.VAR_OVERRIDDEN_BY_VAL_BY_DELEGATION, symbol, overriddenVar, context) } + @OptIn(ExperimentalStdlibApi::class) private fun checkConflictingMembers( containingClass: FirClass, context: CheckerContext, @@ -200,7 +202,10 @@ object FirImplementationMismatchChecker : FirClassChecker() { } val sameArgumentGroups = allFunctions.groupBy { function -> - function.valueParameterSymbols.map { it.resolvedReturnTypeRef.coneType } + buildList { + addIfNotNull(function.resolvedReceiverTypeRef?.type) + function.valueParameterSymbols.mapTo(this) { it.resolvedReturnTypeRef.coneType } + } }.values val clashes = sameArgumentGroups.mapNotNull { fs -> diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java index 9ff2be79223..1785475e2b5 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/diagnostic/compiler/based/DiagnosisCompilerFirTestdataTestGenerated.java @@ -3059,6 +3059,12 @@ public class DiagnosisCompilerFirTestdataTestGenerated extends AbstractDiagnosis runTest("compiler/fir/analysis-tests/testData/resolve/overrides/protobufExt.kt"); } + @Test + @TestMetadata("sameValueParametersDifferentReceiver.kt") + public void testSameValueParametersDifferentReceiver() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/overrides/sameValueParametersDifferentReceiver.kt"); + } + @Test @TestMetadata("simple.kt") public void testSimple() throws Exception {