diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/HierarchicalMppIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/HierarchicalMppIT.kt
index e136728..237a6fe 100644
--- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/HierarchicalMppIT.kt
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/HierarchicalMppIT.kt
@@ -19,6 +19,7 @@
 import java.util.zip.ZipFile
 import kotlin.test.Test
 import kotlin.test.assertEquals
+import kotlin.test.assertNotNull
 import kotlin.test.assertTrue
 
 class HierarchicalMppIT : BaseGradleIT() {
@@ -506,12 +507,13 @@
     }
 
     @Test
-    fun testCompileOnlyDependencyProcessingForMetadataCompilations() = with(transformNativeTestProjectWithPluginDsl("hierarchical-mpp-project-dependency")) {
-        publishThirdPartyLib(withGranularMetadata = true)
+    fun testCompileOnlyDependencyProcessingForMetadataCompilations() =
+        with(transformNativeTestProjectWithPluginDsl("hierarchical-mpp-project-dependency")) {
+            publishThirdPartyLib(withGranularMetadata = true)
 
-        gradleBuildScript("my-lib-foo").appendText("\ndependencies { \"jvmAndJsMainCompileOnly\"(kotlin(\"test-annotations-common\")) }")
-        projectDir.resolve("my-lib-foo/src/jvmAndJsMain/kotlin/UseCompileOnlyDependency.kt").writeText(
-            """
+            gradleBuildScript("my-lib-foo").appendText("\ndependencies { \"jvmAndJsMainCompileOnly\"(kotlin(\"test-annotations-common\")) }")
+            projectDir.resolve("my-lib-foo/src/jvmAndJsMain/kotlin/UseCompileOnlyDependency.kt").writeText(
+                """
             import kotlin.test.Test
                 
             class UseCompileOnlyDependency {
@@ -519,12 +521,12 @@
                 fun myTest() = Unit
             }
             """.trimIndent()
-        )
+            )
 
-        build(":my-lib-foo:compileJvmAndJsMainKotlinMetadata") {
-            assertSuccessful()
+            build(":my-lib-foo:compileJvmAndJsMainKotlinMetadata") {
+                assertSuccessful()
+            }
         }
-    }
 
     @Test
     fun testHmppDependenciesInJsTests() {
@@ -620,6 +622,18 @@
         }
     }
 
+    @Test
+    fun testNativeLeafTestSourceSetsKt46417() {
+        with(Project("kt-46417-ios-test-source-sets")) {
+            testDependencyTransformations("p2") { reports ->
+                val report = reports.singleOrNull { it.sourceSetName == "iosArm64Test" && it.scope == "implementation" }
+                assertNotNull(report, "No single report for 'iosArm64' and implementation scope")
+                assertEquals(setOf("commonMain", "iosMain"), report.allVisibleSourceSets)
+                assertTrue(report.groupAndModule.endsWith(":p1"))
+            }
+        }
+    }
+
     private fun Project.testDependencyTransformations(
         subproject: String? = null,
         check: CompiledProject.(reports: Iterable<DependencyTransformationReport>) -> Unit
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-46417-ios-test-source-sets/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-46417-ios-test-source-sets/build.gradle.kts
new file mode 100644
index 0000000..2878e47
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-46417-ios-test-source-sets/build.gradle.kts
@@ -0,0 +1,12 @@
+allprojects {
+    repositories {
+        mavenCentral()
+        google()
+        mavenLocal()
+        jcenter()
+    }
+}
+
+plugins {
+    kotlin("multiplatform") apply false
+}
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-46417-ios-test-source-sets/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-46417-ios-test-source-sets/gradle.properties
new file mode 100644
index 0000000..d3eebf3
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-46417-ios-test-source-sets/gradle.properties
@@ -0,0 +1,4 @@
+#kotlin.code.style=official
+#kotlin.js.generate.executable.default=false
+kotlin.mpp.enableGranularSourceSetsMetadata=true
+#kotlin.native.enableDependencyPropagation=false
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-46417-ios-test-source-sets/p1/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-46417-ios-test-source-sets/p1/build.gradle.kts
new file mode 100644
index 0000000..24f904d
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-46417-ios-test-source-sets/p1/build.gradle.kts
@@ -0,0 +1,8 @@
+plugins {
+    kotlin("multiplatform")
+}
+
+kotlin {
+    jvm()
+    ios()
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-46417-ios-test-source-sets/p2/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-46417-ios-test-source-sets/p2/build.gradle.kts
new file mode 100644
index 0000000..c783c00
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-46417-ios-test-source-sets/p2/build.gradle.kts
@@ -0,0 +1,13 @@
+plugins {
+    kotlin("multiplatform")
+}
+
+kotlin {
+    jvm()
+    ios()
+
+    val commonMain by sourceSets.getting
+    commonMain.dependencies {
+        implementation(project(":p1"))
+    }
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-46417-ios-test-source-sets/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-46417-ios-test-source-sets/settings.gradle.kts
new file mode 100644
index 0000000..1f2a758
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt-46417-ios-test-source-sets/settings.gradle.kts
@@ -0,0 +1,14 @@
+pluginManagement {
+    repositories {
+        mavenLocal()
+        gradlePluginPortal()
+    }
+    val kotlin_version: String by settings
+    plugins {
+        kotlin("multiplatform").version(kotlin_version)
+    }
+}
+
+include(":p1")
+include(":p2")
+
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt
index d34557a..59d9a36 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt
@@ -7,6 +7,7 @@
 
 import org.gradle.api.Project
 import org.gradle.api.artifacts.Configuration
+import org.gradle.api.artifacts.ConfigurationContainer
 import org.gradle.api.artifacts.Dependency
 import org.gradle.api.artifacts.component.ProjectComponentIdentifier
 import org.gradle.api.artifacts.result.ResolvedComponentResult
@@ -15,11 +16,13 @@
 import org.gradle.api.file.FileCollection
 import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
 import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
+import org.jetbrains.kotlin.gradle.plugin.mpp.AnonymousConfiguration.createAnonymousConfiguration
 import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope
 import org.jetbrains.kotlin.gradle.plugin.sources.sourceSetDependencyConfigurationByScope
 import java.io.File
 import java.io.InputStream
 import java.util.*
+import java.util.concurrent.atomic.AtomicInteger
 import java.util.zip.ZipEntry
 import java.util.zip.ZipFile
 import java.util.zip.ZipOutputStream
@@ -119,7 +122,7 @@
 
         requestedDependencies.forEach { dependency ->
             if (dependency !in originalDependencies) {
-                modifiedConfiguration = modifiedConfiguration ?: project.configurations.detachedConfiguration().apply {
+                modifiedConfiguration = modifiedConfiguration ?: project.configurations.createAnonymousConfiguration().apply {
                     fun <T> copyAttribute(key: Attribute<T>) {
                         attributes.attribute(key, allSourceSetsConfiguration.attributes.getAttribute(key)!!)
                     }
@@ -468,6 +471,15 @@
     }
 }
 
+private object AnonymousConfiguration {
+    private val configurationCounter = AtomicInteger(0)
+
+    fun ConfigurationContainer.createAnonymousConfiguration(): Configuration {
+        //return detachedConfiguration()
+        return create("kotlinAnonymous${configurationCounter.getAndIncrement()}")
+    }
+}
+
 // This class is needed to encapsulate how we extract the files and point to them in a way that doesn't capture the Gradle project state
 internal abstract class ExtractableMetadataFiles {
     abstract fun getMetadataFilesPerSourceSet(doProcessFiles: Boolean): Map<String, FileCollection>
