Compile stdlib commonTest with metadata compiler
diff --git a/libraries/stdlib/common-test/build.gradle.kts b/libraries/stdlib/common-test/build.gradle.kts
new file mode 100644
index 0000000..0e58936
--- /dev/null
+++ b/libraries/stdlib/common-test/build.gradle.kts
@@ -0,0 +1,75 @@
+import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataCompilation
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompileCommon
+
+/*
+    Utility project that compiles stdlib test code to klib metadata for verification purposes
+ */
+plugins {
+    id("kotlin-multiplatform")
+}
+
+val copyTestSourcesTask = tasks.register<Sync>("copyTestSources") {
+    from(projectDir.parentFile.resolve("test"))
+    into(buildDir.resolve("src/test"))
+}
+
+val copyCommonTestSourcesTask = tasks.register<Sync>("copyCommonTestSources") {
+    from(projectDir.parentFile.resolve("common/test"))
+    into(buildDir.resolve("src/commonTest"))
+}
+
+kotlin {
+    jvm()
+    js(IR)
+
+    metadata {
+        compilations.invokeWhenCreated("commonMain") {
+            compileTaskProvider.configure {
+                compilerOptions {
+                    freeCompilerArgs.addAll(
+                        "-opt-in=kotlin.RequiresOptIn",
+                        "-opt-in=kotlin.ExperimentalUnsignedTypes",
+                        "-opt-in=kotlin.ExperimentalStdlibApi",
+                        "-opt-in=kotlin.io.encoding.ExperimentalEncodingApi",
+                        "-XXLanguage:+RangeUntilOperator",
+                    )
+                }
+            }
+        }
+    }
+
+    sourceSets {
+        commonMain {
+            kotlin.srcDir(copyCommonTestSourcesTask)
+            kotlin.srcDir(copyTestSourcesTask)
+            dependencies {
+                implementation(project(":kotlin-stdlib"))
+                compileOnly(project(":kotlin-test:kotlin-test-common"))
+                compileOnly(project(":kotlin-test:kotlin-test-annotations-common"))
+            }
+        }
+    }
+}
+
+whenMetadataCompilationIsReady("commonMain") { commonMainMetadatCompilation ->
+    whenCompileCommonMainOutputsOfProjectIsReady(":kotlin-stdlib") { libCommonMainOutputs ->
+        commonMainMetadatCompilation.compilerOptions.configure {
+            freeCompilerArgs.add(provider {
+                "-Xfriend-paths=" + libCommonMainOutputs.files.joinToString(",") { it.absolutePath }
+            })
+        }
+    }
+}
+
+fun Project.whenMetadataCompilationIsReady(name: String, code: (KotlinMetadataCompilation<*>) -> Unit) = kotlin {
+    metadata {
+        compilations.invokeWhenCreated(name, code)
+    }
+}
+
+fun Project.whenCompileCommonMainOutputsOfProjectIsReady(projectName: String, code: (FileCollection) -> Unit) {
+    project(projectName).tasks
+        .withType<KotlinCompileCommon>()
+        .matching { it.name == "compileCommonMainKotlinMetadata" }
+        .all { code(outputs.files) }
+}
diff --git a/settings.gradle b/settings.gradle
index b6a5e3e..8ed661a 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -566,6 +566,7 @@
     def stdlibMpp = buildProperties.getBoolean("kotlin.stdlib.mpp", false)
     include ":core:builtins",
             ":kotlin-stdlib-common",
+            ":kotlin-stdlib-common-test",
             ":kotlin-stdlib",
             ":kotlin-stdlib-js",
             ":kotlin-stdlib-js-ir",
@@ -591,6 +592,7 @@
     if (!stdlibMpp) include ":kotlin-stdlib-mpp"
 
     project(':kotlin-stdlib-common').projectDir = "$rootDir/libraries/stdlib/common" as File
+    project(':kotlin-stdlib-common-test').projectDir = "$rootDir/libraries/stdlib/common-test" as File
     project(':kotlin-stdlib').projectDir = "$rootDir/libraries/stdlib" + (stdlibMpp ? "" : "/jvm") as File
     project(':kotlin-stdlib-js').projectDir = "$rootDir/libraries/stdlib/js-v1" as File
     project(':kotlin-stdlib-js-ir').projectDir = "$rootDir/libraries/stdlib/js-ir" as File