diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt index 97c86c30d68..df8d261384a 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt @@ -173,7 +173,9 @@ open class FunctionCodegen( } val nativeFlag = if (irFunction.isExternal) Opcodes.ACC_NATIVE else 0 val syntheticFlag = - if (irFunction.origin.isSynthetic || irFunction.hasAnnotation(JVM_SYNTHETIC_ANNOTATION_FQ_NAME)) Opcodes.ACC_SYNTHETIC + if (irFunction.origin.isSynthetic || irFunction.hasAnnotation(JVM_SYNTHETIC_ANNOTATION_FQ_NAME) || + (irFunction.isSuspend && irFunction.visibility == Visibilities.PRIVATE && !irFunction.isInline) + ) Opcodes.ACC_SYNTHETIC else 0 val strictFpFlag = if (irFunction.hasAnnotation(STRICTFP_ANNOTATION_FQ_NAME)) Opcodes.ACC_STRICT else 0 val synchronizedFlag = if (irFunction.hasAnnotation(SYNCHRONIZED_ANNOTATION_FQ_NAME)) Opcodes.ACC_SYNCHRONIZED else 0 diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt index b71ca55c12a..5a1edae0ae3 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SyntheticAccessorLowering.kt @@ -576,6 +576,8 @@ internal class SyntheticAccessorLowering(val context: JvmBackendContext) : IrEle ((thisObjReference == null || contextDeclarationContainer.symbol.isSubtypeOfClass(thisObjReference)) && (contextDeclarationContainer.isSubclassOf(symbolDeclarationContainer))) return when { + // private suspend functions are generated as synthetic package private + declaration is IrFunction && declaration.isSuspend && declaration.visibility.isPrivate && samePackage -> true declaration.visibility.isPrivate && symbolDeclarationContainer != contextDeclarationContainer -> false declaration.visibility.isProtected && !samePackage && !fromSubclassOfReceiversClass -> false withSuper && !fromSubclassOfReceiversClass -> false diff --git a/compiler/testData/codegen/bytecodeListing/coroutines/privateAccessor.kt b/compiler/testData/codegen/bytecodeListing/coroutines/privateAccessor.kt index 7e19ae57e05..35aae7d604c 100644 --- a/compiler/testData/codegen/bytecodeListing/coroutines/privateAccessor.kt +++ b/compiler/testData/codegen/bytecodeListing/coroutines/privateAccessor.kt @@ -1,5 +1,3 @@ -// IGNORE_BACKEND: JVM_IR -// TODO: KT-37086 // WITH_RUNTIME // COMMON_COROUTINES_TEST import COROUTINES_PACKAGE.* diff --git a/compiler/testData/codegen/bytecodeListing/coroutines/privateAccessor_ir.txt b/compiler/testData/codegen/bytecodeListing/coroutines/privateAccessor_ir.txt new file mode 100644 index 00000000000..96a0cf8cc1f --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/coroutines/privateAccessor_ir.txt @@ -0,0 +1,6 @@ +@kotlin.Metadata +public final class PrivateAccessorKt { + public synthetic final static method access$foo(): void + synthetic final static method bar(p0: kotlin.coroutines.Continuation): java.lang.Object + private final static method foo(): void +}