From a42cb2f37f9879c5c29b371904602cd84aa32a3d Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Mon, 28 Aug 2023 17:12:53 +0200 Subject: [PATCH] [FIR] Allow treating candidates from the same non-source module as equivalent This situation occurs in Native metadata compilation and lead to false-positive OVERLOAD_RESOLUTION_AMBIGUITY reports. #KT-61461 Fixed --- .../jvm/ConeEquivalentCallConflictResolver.kt | 7 +++++-- .../org/jetbrains/kotlin/gradle/K2Tests.kt | 12 +++++++++++ .../build.gradle.kts | 20 +++++++++++++++++++ .../src/nativeMain/kotlin/Main.native.kt | 11 ++++++++++ 4 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-native-intermediate-multiple-targets/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-native-intermediate-multiple-targets/src/nativeMain/kotlin/Main.native.kt diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/ConeEquivalentCallConflictResolver.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/ConeEquivalentCallConflictResolver.kt index 5683bae4de7..36e01bede33 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/ConeEquivalentCallConflictResolver.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/ConeEquivalentCallConflictResolver.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.resolve.calls.jvm +import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.containingClassLookupTag import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.isExpect @@ -70,11 +71,13 @@ class ConeEquivalentCallConflictResolver( secondCandidate: Candidate ): Boolean { if (first.symbol.callableId != second.symbol.callableId) return false - // Emulate behavior from K1 where declarations from the same module are never equivalent. + // Emulate behavior from K1 where declarations from the same source module are never equivalent. // We expect REDECLARATION or CONFLICTING_OVERLOADS to be reported in those cases. // See a.containingDeclaration == b.containingDeclaration check in // org.jetbrains.kotlin.resolve.DescriptorEquivalenceForOverrides.areCallableDescriptorsEquivalent. - if (first.moduleData == second.moduleData) return false + // We can't rely on the fact that library declarations will have different moduleData, e.g. in Native metadata compilation, + // multiple stdlib declarations with the same moduleData can be present, see KT-61461. + if (first.moduleData == second.moduleData && first.moduleData.session.kind == FirSession.Kind.Source) return false if (first.isExpect != second.isExpect) return false if (first is FirVariable != second is FirVariable) { return false diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/K2Tests.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/K2Tests.kt index fd8045c8f29..d24bdf384e8 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/K2Tests.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/K2Tests.kt @@ -89,6 +89,18 @@ class CustomK2Tests : KGPBaseTest() { } } + @Disabled("disable until kotlin/native dependency is updated to include KT-61461") + @GradleTest + @DisplayName("Native metadata of intermediate with multiple targets. KT-61461") + fun nativeMetadataOfIntermediateWithMultipleTargets(gradleVersion: GradleVersion) { + with(project("k2-native-intermediate-multiple-targets", gradleVersion, buildOptions = defaultBuildOptions.copy(languageVersion = "2.0"))) { + val taskToExecute = ":compileNativeMainKotlinMetadata" + build(taskToExecute) { + assertTasksExecuted(taskToExecute) + } + } + } + @Disabled("disable until kotlin/native dependency is updated to include KT-58145") @GradleTest @DisplayName("Compiling shared native source with FirFakeOverrideGenerator referencing a common entity. KT-58145") diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-native-intermediate-multiple-targets/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-native-intermediate-multiple-targets/build.gradle.kts new file mode 100644 index 00000000000..cfc8f8260ec --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-native-intermediate-multiple-targets/build.gradle.kts @@ -0,0 +1,20 @@ +group = "test" +version = "1.0" + +plugins { + kotlin("multiplatform") +} + +repositories { + mavenLocal() + mavenCentral() +} + +kotlin { + applyDefaultHierarchyTemplate() + linuxX64() + macosX64() + macosArm64() + mingwX64() + androidNativeX64() +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-native-intermediate-multiple-targets/src/nativeMain/kotlin/Main.native.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-native-intermediate-multiple-targets/src/nativeMain/kotlin/Main.native.kt new file mode 100644 index 00000000000..a38f338a5db --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/k2-native-intermediate-multiple-targets/src/nativeMain/kotlin/Main.native.kt @@ -0,0 +1,11 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +fun foo() { + require(true) + for (i in 0 until 42) {} +} + +private val mutexPool by lazy { 42 }