diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/CoroutineCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/CoroutineCodegen.kt index 55dd22fccc5..1a807409687 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/CoroutineCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/CoroutineCodegen.kt @@ -36,7 +36,6 @@ import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.types.Variance import org.jetbrains.org.objectweb.asm.MethodVisitor import org.jetbrains.org.objectweb.asm.Opcodes -import org.jetbrains.org.objectweb.asm.tree.AbstractInsnNode import org.jetbrains.org.objectweb.asm.tree.InsnNode import org.jetbrains.org.objectweb.asm.tree.MethodNode diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt index 1771c716d32..3c0eedb3b2f 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt @@ -221,7 +221,7 @@ class ExpressionCodegen( } private fun generateFakeContinuationConstructorIfNeeded() { - val continuationClass = irFunction.suspendForInlineToOriginal()?.continuationClass() ?: return + val continuationClass = irFunction.continuationClass() ?: return val continuationType = typeMapper.mapClass(continuationClass) val continuationIndex = frameMap.getIndex(irFunction.continuationParameter()!!.symbol) with(mv) { 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 1978c3c5500..e9eebce9081 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 @@ -89,11 +89,14 @@ class FunctionCodegen( if (!context.state.classBuilderMode.generateBodies || flags.and(Opcodes.ACC_ABSTRACT) != 0 || irFunction.isExternal) { generateAnnotationDefaultValueIfNeeded(methodVisitor) } else { - val frameMap = irFunction.createFrameMapWithReceivers() + // `$$forInline` versions of suspend functions have the same bodies are the originals, but with different + // name/flags/annotations and with no state machine. + val notForInline = irFunction.suspendForInlineToOriginal() ?: irFunction + val frameMap = notForInline.createFrameMapWithReceivers() context.state.globalInlineContext.enterDeclaration(irFunction.suspendFunctionOriginal().descriptor) try { val adapter = InstructionAdapter(methodVisitor) - ExpressionCodegen(irFunction, signature, frameMap, adapter, classCodegen, inlinedInto, smapOverride).generate() + ExpressionCodegen(notForInline, signature, frameMap, adapter, classCodegen, inlinedInto, smapOverride).generate() } finally { context.state.globalInlineContext.exitDeclaration() } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt index ddbcc929b96..ea6c6a69ad2 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt @@ -14,7 +14,6 @@ import org.jetbrains.kotlin.codegen.BaseExpressionCodegen import org.jetbrains.kotlin.codegen.ClassBuilder import org.jetbrains.kotlin.codegen.OwnerKind import org.jetbrains.kotlin.codegen.inline.* -import org.jetbrains.kotlin.codegen.inline.coroutines.FOR_INLINE_SUFFIX import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.descriptors.DeclarationDescriptor @@ -24,14 +23,11 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticUtils import org.jetbrains.kotlin.incremental.components.LocationInfo import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.incremental.components.Position -import org.jetbrains.kotlin.ir.declarations.IrAttributeContainer import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression -import org.jetbrains.kotlin.ir.util.functions import org.jetbrains.kotlin.ir.util.isSuspend -import org.jetbrains.kotlin.ir.util.parentAsClass import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.doNotAnalyze import org.jetbrains.kotlin.resolve.DescriptorUtils @@ -110,17 +106,8 @@ class IrSourceCompilerForInline( asmMethod: Method ): SMAPAndMethodNode { assert(callableDescriptor == callee.symbol.descriptor.original) { "Expected $callableDescriptor got ${callee.descriptor.original}" } - // Do not inline the generated state-machine, which was generated to support java interop of inline suspend functions. - // Instead, find its $$forInline companion (they share the same attributeOwnerId), which is generated for the inliner to use. - val forInlineFunction = if (callee.isSuspend) - callee.parentAsClass.functions.find { - it.name.asString() == callee.name.asString() + FOR_INLINE_SUFFIX && - it.attributeOwnerId == (callee as IrAttributeContainer).attributeOwnerId - } ?: callee - else - callee - val classCodegen = FakeClassCodegen(forInlineFunction, codegen.classCodegen) - val node = FunctionCodegen(forInlineFunction, classCodegen).generate() + val classCodegen = FakeClassCodegen(callee, codegen.classCodegen) + val node = FunctionCodegen(callee, classCodegen).generate() node.preprocessSuspendMarkers() return SMAPAndMethodNode(node, SMAP(classCodegen.getOrCreateSourceMapper().resultMappings)) } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AddContinuationLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AddContinuationLowering.kt index 75cbf701465..265cab8a0ef 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AddContinuationLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/AddContinuationLowering.kt @@ -27,10 +27,7 @@ import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.builders.declarations.* import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* -import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl -import org.jetbrains.kotlin.ir.expressions.impl.IrFunctionReferenceImpl -import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl -import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl +import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl @@ -59,9 +56,6 @@ private class AddContinuationLowering(private val context: JvmBackendContext) : // each lambda is referenced at most once while creating `$$forInline` methods. addContinuationObjectAndContinuationParameterToSuspendFunctions(irFile) addContinuationParameterToSuspendCalls(irFile) - // This should be done after adding continuation parameters so that `attributeContainerId` links - // inside `$$forInline` copies of `invokeSuspend` do not confuse the previous passes. - fillInvokeSuspendForInlineBodies(irFile) } private fun addContinuationParameterToSuspendCalls(irFile: IrFile) { @@ -213,7 +207,7 @@ private class AddContinuationLowering(private val context: JvmBackendContext) : } } - private fun IrClass.addInvokeSuspendForLambda(irFunction: IrFunction, fields: List, receiverField: IrField?): IrFunction { + private fun IrClass.addInvokeSuspendForLambda(irFunction: IrFunction, fields: List, receiverField: IrField?): IrSimpleFunction { val superMethod = context.ir.symbols.suspendLambdaClass.functions.single { it.owner.name.asString() == INVOKE_SUSPEND_METHOD_NAME && it.owner.valueParameters.size == 1 && it.owner.valueParameters[0].type.isKotlinResult() @@ -231,29 +225,24 @@ private class AddContinuationLowering(private val context: JvmBackendContext) : } } - private fun IrClass.addInvokeSuspendForInlineForLambda(invokeSuspend: IrFunction): IrFunction { + private fun IrClass.addInvokeSuspendForInlineForLambda(invokeSuspend: IrSimpleFunction): IrSimpleFunction { return addFunction( INVOKE_SUSPEND_METHOD_NAME + FOR_INLINE_SUFFIX, context.irBuiltIns.anyNType, Modality.FINAL, origin = JvmLoweredDeclarationOrigin.FOR_INLINE_STATE_MACHINE_TEMPLATE ).apply { + copyAttributes(invokeSuspend) + generateErrorForInlineBody() valueParameters += invokeSuspend.valueParameters.map { it.copyTo(this) } } } - private fun fillInvokeSuspendForInlineBodies(irFile: IrFile) { - irFile.transformChildrenVoid(object : IrElementTransformerVoid() { - override fun visitClass(declaration: IrClass): IrStatement = declaration.transformPostfix { - if (origin == JvmLoweredDeclarationOrigin.SUSPEND_LAMBDA) { - for (function in functions) { - if (function.origin == JvmLoweredDeclarationOrigin.FOR_INLINE_STATE_MACHINE_TEMPLATE) { - function.body = functions.single { it.name.asString() == "invokeSuspend" }.copyBodyTo(function) - } - } - } - } - }) + private fun IrSimpleFunction.generateErrorForInlineBody() { + val message = "This is a stub representing a copy of a suspend method without the state machine " + + "(used by the inliner). Since the difference is at the bytecode level, the body is " + + "still on the original function. Use suspendForInlineToOriginal() to retrieve it." + body = IrExpressionBodyImpl(startOffset, endOffset, IrErrorExpressionImpl(startOffset, endOffset, returnType, message)) } private fun IrDeclarationContainer.addFunctionOverride(function: IrSimpleFunction): IrSimpleFunction = @@ -593,7 +582,7 @@ private class AddContinuationLowering(private val context: JvmBackendContext) : annotations += view.annotations.map { it.deepCopyWithSymbols(this) } copyParameterDeclarationsFrom(view) copyAttributes(view) - body = view.copyBodyTo(this) + generateErrorForInlineBody() } } diff --git a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline_ir.txt b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline_ir.txt index d04fb6d49ed..5e808ce07ad 100644 --- a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline_ir.txt +++ b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline_ir.txt @@ -210,62 +210,6 @@ public final class CrossinlineKt$filter$lambda-3$$inlined$consumeEach$2 { public @org.jetbrains.annotations.Nullable method send(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object } -@kotlin.Metadata -@kotlin.coroutines.jvm.internal.DebugMetadata -public final class CrossinlineKt$fold$$forInline$$inlined$consumeEach$1$1 { - field L$0: java.lang.Object - field L$1: java.lang.Object - field L$2: java.lang.Object - field L$3: java.lang.Object - field label: int - synthetic field result: java.lang.Object - synthetic final field this$0: CrossinlineKt$fold$$forInline$$inlined$consumeEach$1 - inner class CrossinlineKt$fold$$forInline$$inlined$consumeEach$1 - inner class CrossinlineKt$fold$$forInline$$inlined$consumeEach$1$1 - public method (p0: CrossinlineKt$fold$$forInline$$inlined$consumeEach$1, p1: kotlin.coroutines.Continuation): void - public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object -} - -@kotlin.Metadata -public final class CrossinlineKt$fold$$forInline$$inlined$consumeEach$1 { - synthetic final field $acc$inlined: kotlin.jvm.internal.Ref$ObjectRef - synthetic final field $operation$inlined: kotlin.jvm.functions.Function3 - inner class CrossinlineKt$fold$$forInline$$inlined$consumeEach$1 - inner class CrossinlineKt$fold$$forInline$$inlined$consumeEach$1$1 - public method (p0: kotlin.jvm.internal.Ref$ObjectRef, p1: kotlin.jvm.functions.Function3): void - public method close(@org.jetbrains.annotations.Nullable p0: java.lang.Throwable): void - public @org.jetbrains.annotations.Nullable method send$$forInline(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object - public @org.jetbrains.annotations.Nullable method send(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object -} - -@kotlin.Metadata -@kotlin.coroutines.jvm.internal.DebugMetadata -public final class CrossinlineKt$fold$$forInline$$inlined$consumeEach$2$1 { - field L$0: java.lang.Object - field L$1: java.lang.Object - field L$2: java.lang.Object - field L$3: java.lang.Object - field label: int - synthetic field result: java.lang.Object - synthetic final field this$0: CrossinlineKt$fold$$forInline$$inlined$consumeEach$2 - inner class CrossinlineKt$fold$$forInline$$inlined$consumeEach$2 - inner class CrossinlineKt$fold$$forInline$$inlined$consumeEach$2$1 - public method (p0: CrossinlineKt$fold$$forInline$$inlined$consumeEach$2, p1: kotlin.coroutines.Continuation): void - public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object -} - -@kotlin.Metadata -public final class CrossinlineKt$fold$$forInline$$inlined$consumeEach$2 { - synthetic final field $acc$inlined: kotlin.jvm.internal.Ref$ObjectRef - synthetic final field $operation$inlined: kotlin.jvm.functions.Function3 - inner class CrossinlineKt$fold$$forInline$$inlined$consumeEach$2 - inner class CrossinlineKt$fold$$forInline$$inlined$consumeEach$2$1 - public method (p0: kotlin.jvm.internal.Ref$ObjectRef, p1: kotlin.jvm.functions.Function3): void - public method close(@org.jetbrains.annotations.Nullable p0: java.lang.Throwable): void - public @org.jetbrains.annotations.Nullable method send$$forInline(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object - public @org.jetbrains.annotations.Nullable method send(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object -} - @kotlin.Metadata @kotlin.coroutines.jvm.internal.DebugMetadata public final class CrossinlineKt$fold$$inlined$consumeEach$1$1 { @@ -294,6 +238,62 @@ public final class CrossinlineKt$fold$$inlined$consumeEach$1 { public @org.jetbrains.annotations.Nullable method send(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object } +@kotlin.Metadata +@kotlin.coroutines.jvm.internal.DebugMetadata +public final class CrossinlineKt$fold$$inlined$consumeEach$2$1 { + field L$0: java.lang.Object + field L$1: java.lang.Object + field L$2: java.lang.Object + field L$3: java.lang.Object + field label: int + synthetic field result: java.lang.Object + synthetic final field this$0: CrossinlineKt$fold$$inlined$consumeEach$2 + inner class CrossinlineKt$fold$$inlined$consumeEach$2 + inner class CrossinlineKt$fold$$inlined$consumeEach$2$1 + public method (p0: CrossinlineKt$fold$$inlined$consumeEach$2, p1: kotlin.coroutines.Continuation): void + public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object +} + +@kotlin.Metadata +public final class CrossinlineKt$fold$$inlined$consumeEach$2 { + synthetic final field $acc$inlined: kotlin.jvm.internal.Ref$ObjectRef + synthetic final field $operation$inlined: kotlin.jvm.functions.Function3 + inner class CrossinlineKt$fold$$inlined$consumeEach$2 + inner class CrossinlineKt$fold$$inlined$consumeEach$2$1 + public method (p0: kotlin.jvm.internal.Ref$ObjectRef, p1: kotlin.jvm.functions.Function3): void + public method close(@org.jetbrains.annotations.Nullable p0: java.lang.Throwable): void + public @org.jetbrains.annotations.Nullable method send$$forInline(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object + public @org.jetbrains.annotations.Nullable method send(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object +} + +@kotlin.Metadata +@kotlin.coroutines.jvm.internal.DebugMetadata +public final class CrossinlineKt$fold$$inlined$consumeEach$3$1 { + field L$0: java.lang.Object + field L$1: java.lang.Object + field L$2: java.lang.Object + field L$3: java.lang.Object + field label: int + synthetic field result: java.lang.Object + synthetic final field this$0: CrossinlineKt$fold$$inlined$consumeEach$3 + inner class CrossinlineKt$fold$$inlined$consumeEach$3 + inner class CrossinlineKt$fold$$inlined$consumeEach$3$1 + public method (p0: CrossinlineKt$fold$$inlined$consumeEach$3, p1: kotlin.coroutines.Continuation): void + public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object +} + +@kotlin.Metadata +public final class CrossinlineKt$fold$$inlined$consumeEach$3 { + synthetic final field $acc$inlined: kotlin.jvm.internal.Ref$ObjectRef + synthetic final field $operation$inlined: kotlin.jvm.functions.Function3 + inner class CrossinlineKt$fold$$inlined$consumeEach$3 + inner class CrossinlineKt$fold$$inlined$consumeEach$3$1 + public method (p0: kotlin.jvm.internal.Ref$ObjectRef, p1: kotlin.jvm.functions.Function3): void + public method close(@org.jetbrains.annotations.Nullable p0: java.lang.Throwable): void + public @org.jetbrains.annotations.Nullable method send$$forInline(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object + public @org.jetbrains.annotations.Nullable method send(p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object +} + @kotlin.Metadata @kotlin.coroutines.jvm.internal.DebugMetadata final class CrossinlineKt$fold$1 { diff --git a/compiler/testData/codegen/boxInline/suspend/nonLocalReturn.kt b/compiler/testData/codegen/boxInline/suspend/nonLocalReturn.kt new file mode 100644 index 00000000000..b919d7dd95f --- /dev/null +++ b/compiler/testData/codegen/boxInline/suspend/nonLocalReturn.kt @@ -0,0 +1,25 @@ +// WITH_RUNTIME +// WITH_COROUTINES +// IGNORE_BACKEND: JVM +// IGNORE_BACKEND_MULTI_MODULE: JVM +// NO_CHECK_LAMBDA_INLINING +// FILE: a.kt + +inline suspend fun runReturning(lambda: suspend () -> Unit): Unit = + lambda() + +inline suspend fun myRun(lambda: suspend () -> String): String { + runReturning { return lambda() } + return "fail: did not return from lambda" +} + +// FILE: b.kt +import helpers.* +import kotlin.coroutines.* +import kotlin.coroutines.intrinsics.* + +fun box(): String { + var result = "fail" + suspend { result = myRun { "OK" } }.startCoroutine(EmptyContinuation) + return result +} diff --git a/compiler/testData/codegen/bytecodeText/coroutines/nonLocalReturn.kt b/compiler/testData/codegen/bytecodeText/coroutines/nonLocalReturn.kt new file mode 100644 index 00000000000..b80321d461f --- /dev/null +++ b/compiler/testData/codegen/bytecodeText/coroutines/nonLocalReturn.kt @@ -0,0 +1,12 @@ +// WITH_COROUTINES +// TREAT_AS_ONE_FILE + +inline suspend fun runReturning(lambda: suspend () -> Unit): Unit = + lambda() + +inline suspend fun myRun(lambda: suspend () -> String): String { + runReturning { return lambda() } + return "fail: did not return from lambda" +} + +// 0 NON_LOCAL_RETURN \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxInlineCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxInlineCodegenTestGenerated.java index 45e9d23054a..703104ce9cf 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxInlineCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxInlineCodegenTestGenerated.java @@ -3898,6 +3898,11 @@ public class BlackBoxInlineCodegenTestGenerated extends AbstractBlackBoxInlineCo runTest("compiler/testData/codegen/boxInline/suspend/nestedMethodWith2XParameter.kt"); } + @TestMetadata("nonLocalReturn.kt") + public void testNonLocalReturn() throws Exception { + runTest("compiler/testData/codegen/boxInline/suspend/nonLocalReturn.kt"); + } + @TestMetadata("nonSuspendCrossinline.kt") public void testNonSuspendCrossinline_1_2() throws Exception { runTestWithPackageReplacement("compiler/testData/codegen/boxInline/suspend/nonSuspendCrossinline.kt", "kotlin.coroutines.experimental"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java index b21066f70c3..bd47e602c31 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java @@ -1391,6 +1391,11 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest { runTest("compiler/testData/codegen/bytecodeText/coroutines/doNotReassignContinuation.kt"); } + @TestMetadata("nonLocalReturn.kt") + public void testNonLocalReturn() throws Exception { + runTest("compiler/testData/codegen/bytecodeText/coroutines/nonLocalReturn.kt"); + } + @TestMetadata("returnUnitInLambda.kt") public void testReturnUnitInLambda_1_2() throws Exception { runTestWithPackageReplacement("compiler/testData/codegen/bytecodeText/coroutines/returnUnitInLambda.kt", "kotlin.coroutines.experimental"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstInlineKotlinTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstInlineKotlinTestGenerated.java index ecb1b6ca313..5f1c11a5701 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstInlineKotlinTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstInlineKotlinTestGenerated.java @@ -3898,6 +3898,11 @@ public class CompileKotlinAgainstInlineKotlinTestGenerated extends AbstractCompi runTest("compiler/testData/codegen/boxInline/suspend/nestedMethodWith2XParameter.kt"); } + @TestMetadata("nonLocalReturn.kt") + public void testNonLocalReturn() throws Exception { + runTest("compiler/testData/codegen/boxInline/suspend/nonLocalReturn.kt"); + } + @TestMetadata("nonSuspendCrossinline.kt") public void testNonSuspendCrossinline_1_2() throws Exception { runTestWithPackageReplacement("compiler/testData/codegen/boxInline/suspend/nonSuspendCrossinline.kt", "kotlin.coroutines.experimental"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxInlineCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxInlineCodegenTestGenerated.java index eaff9bd124b..9bbb2b12f7c 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxInlineCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxInlineCodegenTestGenerated.java @@ -3813,6 +3813,11 @@ public class IrBlackBoxInlineCodegenTestGenerated extends AbstractIrBlackBoxInli runTest("compiler/testData/codegen/boxInline/suspend/nestedMethodWith2XParameter.kt"); } + @TestMetadata("nonLocalReturn.kt") + public void testNonLocalReturn() throws Exception { + runTest("compiler/testData/codegen/boxInline/suspend/nonLocalReturn.kt"); + } + @TestMetadata("nonSuspendCrossinline.kt") public void testNonSuspendCrossinline_1_3() throws Exception { runTestWithPackageReplacement("compiler/testData/codegen/boxInline/suspend/nonSuspendCrossinline.kt", "kotlin.coroutines"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBytecodeTextTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBytecodeTextTestGenerated.java index 6bbebbedb52..4a5f3894dc0 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBytecodeTextTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBytecodeTextTestGenerated.java @@ -1401,6 +1401,11 @@ public class IrBytecodeTextTestGenerated extends AbstractIrBytecodeTextTest { runTest("compiler/testData/codegen/bytecodeText/coroutines/doNotReassignContinuation.kt"); } + @TestMetadata("nonLocalReturn.kt") + public void testNonLocalReturn() throws Exception { + runTest("compiler/testData/codegen/bytecodeText/coroutines/nonLocalReturn.kt"); + } + @TestMetadata("returnUnitInLambda.kt") public void testReturnUnitInLambda_1_3() throws Exception { runTestWithPackageReplacement("compiler/testData/codegen/bytecodeText/coroutines/returnUnitInLambda.kt", "kotlin.coroutines"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrCompileKotlinAgainstInlineKotlinTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrCompileKotlinAgainstInlineKotlinTestGenerated.java index e991d3a5d21..9d5a93d36a9 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrCompileKotlinAgainstInlineKotlinTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrCompileKotlinAgainstInlineKotlinTestGenerated.java @@ -3813,6 +3813,11 @@ public class IrCompileKotlinAgainstInlineKotlinTestGenerated extends AbstractIrC runTest("compiler/testData/codegen/boxInline/suspend/nestedMethodWith2XParameter.kt"); } + @TestMetadata("nonLocalReturn.kt") + public void testNonLocalReturn() throws Exception { + runTest("compiler/testData/codegen/boxInline/suspend/nonLocalReturn.kt"); + } + @TestMetadata("nonSuspendCrossinline.kt") public void testNonSuspendCrossinline_1_3() throws Exception { runTestWithPackageReplacement("compiler/testData/codegen/boxInline/suspend/nonSuspendCrossinline.kt", "kotlin.coroutines"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenInlineTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenInlineTestGenerated.java index 0112ad6727d..884daf426e1 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenInlineTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenInlineTestGenerated.java @@ -3388,6 +3388,11 @@ public class IrJsCodegenInlineTestGenerated extends AbstractIrJsCodegenInlineTes runTestWithPackageReplacement("compiler/testData/codegen/boxInline/suspend/multipleSuspensionPoints.kt", "kotlin.coroutines"); } + @TestMetadata("nonLocalReturn.kt") + public void testNonLocalReturn() throws Exception { + runTest("compiler/testData/codegen/boxInline/suspend/nonLocalReturn.kt"); + } + @TestMetadata("nonSuspendCrossinline.kt") public void testNonSuspendCrossinline_1_3() throws Exception { runTestWithPackageReplacement("compiler/testData/codegen/boxInline/suspend/nonSuspendCrossinline.kt", "kotlin.coroutines"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenInlineTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenInlineTestGenerated.java index 67c29ac451e..7953445f8b5 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenInlineTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenInlineTestGenerated.java @@ -3388,6 +3388,11 @@ public class JsCodegenInlineTestGenerated extends AbstractJsCodegenInlineTest { runTestWithPackageReplacement("compiler/testData/codegen/boxInline/suspend/multipleSuspensionPoints.kt", "kotlin.coroutines"); } + @TestMetadata("nonLocalReturn.kt") + public void testNonLocalReturn() throws Exception { + runTest("compiler/testData/codegen/boxInline/suspend/nonLocalReturn.kt"); + } + @TestMetadata("nonSuspendCrossinline.kt") public void testNonSuspendCrossinline_1_3() throws Exception { runTestWithPackageReplacement("compiler/testData/codegen/boxInline/suspend/nonSuspendCrossinline.kt", "kotlin.coroutines");