diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.kt index d030ebc8d74..5fc732ff529 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.kt @@ -59,7 +59,7 @@ class AnonymousObjectTransformer( createClassReader().accept(object : ClassVisitor(Opcodes.API_VERSION, classBuilder.visitor) { override fun visit(version: Int, access: Int, name: String, signature: String?, superName: String, interfaces: Array) { - classBuilder.defineClass(null, version, access, name, signature, superName, interfaces) + classBuilder.defineClass(null, maxOf(version, state.classFileVersion), access, name, signature, superName, interfaces) if (languageVersionSettings.isCoroutineSuperClass(superName)) { inliningContext.isContinuation = true } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ObjectTransformer.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ObjectTransformer.kt index c3638c35da1..4cf70706bb2 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ObjectTransformer.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ObjectTransformer.kt @@ -66,7 +66,7 @@ class WhenMappingTransformer( val fieldNode = transformationInfo.fieldNode classReader.accept(object : ClassVisitor(Opcodes.API_VERSION, classBuilder.visitor) { override fun visit(version: Int, access: Int, name: String, signature: String?, superName: String, interfaces: Array) { - classBuilder.defineClass(null, version, access, name, signature, superName, interfaces) + classBuilder.defineClass(null, maxOf(version, state.classFileVersion), access, name, signature, superName, interfaces) } override fun visitField(access: Int, name: String, desc: String, signature: String?, value: Any?): FieldVisitor? { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/SamWrapperTransformer.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/SamWrapperTransformer.kt index db67b66d6bd..9c625d45ddc 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/SamWrapperTransformer.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/SamWrapperTransformer.kt @@ -61,7 +61,7 @@ class SamWrapperTransformer(transformationInfo: SamWrapperTransformationInfo, pr classReader.accept(object : ClassVisitor(Opcodes.API_VERSION, classBuilder.visitor) { override fun visit(version: Int, access: Int, name: String, signature: String?, superName: String, interfaces: Array) { - classBuilder.defineClass(null, version, access, name, signature, superName, interfaces) + classBuilder.defineClass(null, maxOf(version, state.classFileVersion), access, name, signature, superName, interfaces) } }, ClassReader.SKIP_FRAMES) @@ -69,4 +69,4 @@ class SamWrapperTransformer(transformationInfo: SamWrapperTransformationInfo, pr return transformationResult } -} \ No newline at end of file +} diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/inlineAnonymousObjectWithDifferentTarget/library/A.java b/compiler/testData/compileKotlinAgainstCustomBinaries/inlineAnonymousObjectWithDifferentTarget/library/A.java new file mode 100644 index 00000000000..b17247b0669 --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/inlineAnonymousObjectWithDifferentTarget/library/A.java @@ -0,0 +1,3 @@ +public interface A { + public static void method() {} +} diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/inlineAnonymousObjectWithDifferentTarget/library/foo.kt b/compiler/testData/compileKotlinAgainstCustomBinaries/inlineAnonymousObjectWithDifferentTarget/library/foo.kt new file mode 100644 index 00000000000..b6e918d4df4 --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/inlineAnonymousObjectWithDifferentTarget/library/foo.kt @@ -0,0 +1,5 @@ +inline fun foo(crossinline x: () -> Unit): Any = object { + init { + x() + } +} diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/inlineAnonymousObjectWithDifferentTarget/output.txt b/compiler/testData/compileKotlinAgainstCustomBinaries/inlineAnonymousObjectWithDifferentTarget/output.txt new file mode 100644 index 00000000000..d86bac9de59 --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/inlineAnonymousObjectWithDifferentTarget/output.txt @@ -0,0 +1 @@ +OK diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/inlineAnonymousObjectWithDifferentTarget/source.kt b/compiler/testData/compileKotlinAgainstCustomBinaries/inlineAnonymousObjectWithDifferentTarget/source.kt new file mode 100644 index 00000000000..0a944a62da8 --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/inlineAnonymousObjectWithDifferentTarget/source.kt @@ -0,0 +1,5 @@ +fun main() { + foo { + A.method() + } +} diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.kt b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.kt index acf27121a8f..f5226f119f0 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.kt @@ -588,6 +588,14 @@ class CompileKotlinAgainstCustomBinariesTest : AbstractKotlinCompilerIntegration ) } + fun testInlineAnonymousObjectWithDifferentTarget() { + val library = compileLibrary("library", additionalOptions = listOf("-jvm-target", "1.6")) + compileKotlin("source.kt", tmpdir, listOf(library), additionalOptions = listOf("-jvm-target", "1.8")) + val classLoader = + URLClassLoader(arrayOf(library.toURI().toURL(), tmpdir.toURI().toURL()), ForTestCompileRuntime.runtimeJarClassLoader()) + classLoader.loadClass("SourceKt").getDeclaredMethod("main").invoke(null) + } + companion object { // compiler before 1.1.4 version did not include suspension marks into bytecode. private fun stripSuspensionMarksToImitateLegacyCompiler(bytes: ByteArray): Pair {