diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenAnnotatingVisitor.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenAnnotatingVisitor.java index 3e6b0d098ca..9adfe8cb09c 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenAnnotatingVisitor.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenAnnotatingVisitor.java @@ -655,7 +655,7 @@ class CodegenAnnotatingVisitor extends KtVisitorVoid { public void visitCallExpression(@NotNull KtCallExpression expression) { super.visitCallExpression(expression); checkSamCall(expression); - checkCrossinlineSuspendCall(expression); + checkCrossinlineCall(expression); recordSuspendFunctionTypeWrapperForArguments(expression); } @@ -706,7 +706,7 @@ class CodegenAnnotatingVisitor extends KtVisitorVoid { } } - private void checkCrossinlineSuspendCall(@NotNull KtCallExpression expression) { + private void checkCrossinlineCall(@NotNull KtCallExpression expression) { KtExpression callee = expression.getCalleeExpression(); Call call = bindingContext.get(CALL, callee); ResolvedCall resolvedCall = bindingContext.get(RESOLVED_CALL, call); @@ -714,30 +714,21 @@ class CodegenAnnotatingVisitor extends KtVisitorVoid { if (resolvedCall instanceof VariableAsFunctionResolvedCall) { VariableAsFunctionResolvedCall variableAsFunction = (VariableAsFunctionResolvedCall) resolvedCall; VariableDescriptor variableDescriptor = variableAsFunction.getVariableCall().getResultingDescriptor(); - CallableDescriptor callableDescriptor = ((ResolvedCall) variableAsFunction).getResultingDescriptor(); if (variableDescriptor instanceof ValueParameterDescriptor && - ((ValueParameterDescriptor) variableDescriptor).isCrossinline() && - callableDescriptor instanceof FunctionDescriptor && - ((FunctionDescriptor) callableDescriptor).isSuspend()) { - FunctionDescriptor enclosingDescriptor = - bindingContext.get(ENCLOSING_SUSPEND_FUNCTION_FOR_SUSPEND_FUNCTION_CALL, resolvedCall.getCall()); - if (enclosingDescriptor == null) return; - + ((ValueParameterDescriptor) variableDescriptor).isCrossinline()) { DeclarationDescriptor functionWithCrossinlineParameter = variableDescriptor.getContainingDeclaration(); for (int i = functionsStack.size() - 1; i >= 0; i--) { - if (functionsStack.get(i).isSuspend()) { - Boolean alreadyPutValue = bindingTrace.getBindingContext() - .get(CodegenBinding.CAPTURES_CROSSINLINE_SUSPEND_LAMBDA, functionsStack.get(i)); - if (alreadyPutValue != null && alreadyPutValue) { - return; - } - bindingTrace.record( - CodegenBinding.CAPTURES_CROSSINLINE_SUSPEND_LAMBDA, - functionsStack.get(i), - true - ); + Boolean alreadyPutValue = bindingTrace.getBindingContext() + .get(CodegenBinding.CAPTURES_CROSSINLINE_LAMBDA, functionsStack.get(i)); + if (alreadyPutValue != null && alreadyPutValue) { + return; } + bindingTrace.record( + CodegenBinding.CAPTURES_CROSSINLINE_LAMBDA, + functionsStack.get(i), + true + ); if (functionsStack.get(i) == functionWithCrossinlineParameter) { return; } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenBinding.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenBinding.java index a4481ad0887..83bdca4865d 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenBinding.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenBinding.java @@ -55,7 +55,7 @@ public class CodegenBinding { public static final WritableSlice SUSPEND_FUNCTION_TO_JVM_VIEW = Slices.createSimpleSlice(); - public static final WritableSlice CAPTURES_CROSSINLINE_SUSPEND_LAMBDA = + public static final WritableSlice CAPTURES_CROSSINLINE_LAMBDA = Slices.createSimpleSlice(); public static final WritableSlice RECURSIVE_SUSPEND_CALLABLE_REFERENCE = diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/CoroutineCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/CoroutineCodegen.kt index 6202c77a313..e6d7fc22527 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/CoroutineCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/CoroutineCodegen.kt @@ -6,10 +6,9 @@ package org.jetbrains.kotlin.codegen.coroutines import com.intellij.util.ArrayUtil -import org.jetbrains.kotlin.backend.common.CodegenUtil import org.jetbrains.kotlin.codegen.* import org.jetbrains.kotlin.codegen.binding.CodegenBinding -import org.jetbrains.kotlin.codegen.binding.CodegenBinding.CAPTURES_CROSSINLINE_SUSPEND_LAMBDA +import org.jetbrains.kotlin.codegen.binding.CodegenBinding.CAPTURES_CROSSINLINE_LAMBDA import org.jetbrains.kotlin.codegen.context.ClosureContext import org.jetbrains.kotlin.codegen.context.MethodContext import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings.METHOD_FOR_FUNCTION @@ -498,7 +497,7 @@ class CoroutineCodegenForLambda private constructor( classBuilder, originalSuspendLambdaDescriptor, // Local suspend lambdas, which call crossinline suspend parameters of containing functions must be generated after inlining - expressionCodegen.bindingContext[CAPTURES_CROSSINLINE_SUSPEND_LAMBDA, originalSuspendLambdaDescriptor] == true + expressionCodegen.bindingContext[CAPTURES_CROSSINLINE_LAMBDA, originalSuspendLambdaDescriptor] == true ) } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/SuspendFunctionGenerationStrategy.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/SuspendFunctionGenerationStrategy.kt index 733bee7dccf..d369b759585 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/SuspendFunctionGenerationStrategy.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/SuspendFunctionGenerationStrategy.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.codegen.coroutines -import org.jetbrains.kotlin.backend.common.CodegenUtil import org.jetbrains.kotlin.codegen.ClassBuilder import org.jetbrains.kotlin.codegen.ExpressionCodegen import org.jetbrains.kotlin.codegen.FunctionGenerationStrategy @@ -54,7 +53,7 @@ open class SuspendFunctionGenerationStrategy( override fun wrapMethodVisitor(mv: MethodVisitor, access: Int, name: String, desc: String): MethodVisitor { if (access and Opcodes.ACC_ABSTRACT != 0) return mv - if (state.bindingContext[CodegenBinding.CAPTURES_CROSSINLINE_SUSPEND_LAMBDA, originalSuspendDescriptor] == true) { + if (state.bindingContext[CodegenBinding.CAPTURES_CROSSINLINE_LAMBDA, originalSuspendDescriptor] == true) { return AddConstructorCallForCoroutineRegeneration( mv, access, name, desc, null, null, this::classBuilderForCoroutineState, containingClassInternalName, diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/coroutines/CoroutineTransformer.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/coroutines/CoroutineTransformer.kt index 361f3329bbe..98bd25aa32c 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/coroutines/CoroutineTransformer.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/coroutines/CoroutineTransformer.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license * that can be found in the license/LICENSE.txt file. */ @@ -7,7 +7,10 @@ package org.jetbrains.kotlin.codegen.inline.coroutines import com.intellij.util.ArrayUtil import org.jetbrains.kotlin.codegen.ClassBuilder -import org.jetbrains.kotlin.codegen.coroutines.* +import org.jetbrains.kotlin.codegen.coroutines.CoroutineTransformerMethodVisitor +import org.jetbrains.kotlin.codegen.coroutines.getLastParameterIndex +import org.jetbrains.kotlin.codegen.coroutines.isResumeImplMethodName +import org.jetbrains.kotlin.codegen.coroutines.replaceFakeContinuationsWithRealOnes import org.jetbrains.kotlin.codegen.inline.* import org.jetbrains.kotlin.codegen.optimization.common.asSequence import org.jetbrains.kotlin.config.isReleaseCoroutines @@ -17,8 +20,8 @@ import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin import org.jetbrains.kotlin.utils.addToStdlib.cast import org.jetbrains.kotlin.utils.sure import org.jetbrains.org.objectweb.asm.Opcodes -import org.jetbrains.org.objectweb.asm.tree.MethodNode import org.jetbrains.org.objectweb.asm.tree.MethodInsnNode +import org.jetbrains.org.objectweb.asm.tree.MethodNode import org.jetbrains.org.objectweb.asm.tree.TypeInsnNode class CoroutineTransformer( @@ -32,14 +35,14 @@ class CoroutineTransformer( fun shouldTransform(node: MethodNode): Boolean { if (isContinuationNotLambda()) return false - val crossinlineSuspend = crossinlineSuspend() ?: return false + val crossinlineParam = crossinlineLambda() ?: return false if (inliningContext.isInliningLambda && !inliningContext.isContinuation) return false return when { isSuspendFunction(node) -> true isSuspendLambda(node) -> { if (isStateMachine(node)) return false val functionDescriptor = - crossinlineSuspend.invokeMethodDescriptor.containingDeclaration as? FunctionDescriptor ?: return true + crossinlineParam.invokeMethodDescriptor.containingDeclaration as? FunctionDescriptor ?: return true !functionDescriptor.isInline } else -> false @@ -50,8 +53,8 @@ class CoroutineTransformer( if (state.languageVersionSettings.isReleaseCoroutines()) superClassName.endsWith("ContinuationImpl") else methods.any { it.name == "getLabel" } - private fun crossinlineSuspend(): PsiExpressionLambda? = inliningContext.expressionMap.values.find { - it is PsiExpressionLambda && it.isCrossInline && it.invokeMethodDescriptor.isSuspend + private fun crossinlineLambda(): PsiExpressionLambda? = inliningContext.expressionMap.values.find { + it is PsiExpressionLambda && it.isCrossInline }?.cast() private fun isStateMachine(node: MethodNode): Boolean = @@ -60,7 +63,7 @@ class CoroutineTransformer( private fun isSuspendLambda(node: MethodNode) = isResumeImpl(node) fun newMethod(node: MethodNode): DeferredMethodVisitor { - val element = crossinlineSuspend()?.functionWithBodyOrCallableReference.sure { + val element = crossinlineLambda()?.functionWithBodyOrCallableReference.sure { "crossinline lambda should have element" } return when { diff --git a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/epam.kt b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/epam.kt new file mode 100644 index 00000000000..63b36e9d3f0 --- /dev/null +++ b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/epam.kt @@ -0,0 +1,34 @@ +// IGNORE_BACKEND: JVM_IR +// FULL_JDK +// COMMON_COROUTINES_TEST +// WITH_RUNTIME +// WITH_COROUTINES +// CHECK_BYTECODE_LISTING + +import helpers.* +import COROUTINES_PACKAGE.* + +class MyDeferred(val t: suspend () -> T) { + suspend fun await() = t() +} + +fun async(block: suspend () -> T) = MyDeferred(block) + +inline fun zip(source1: MyDeferred, source2: MyDeferred, crossinline zipper: (T1, T2) -> R) = + async { + zipper(source1.await(), source2.await()) + } + +fun builder(c: suspend () -> Unit) { + c.startCoroutine(EmptyContinuation) +} + +fun box(): String { + val first = MyDeferred { 1 } + val second = MyDeferred { 2 } + var result = -1 + builder { + result = zip(first, second) { firstValue: Int, secondValue: Int -> firstValue + secondValue }.await() + } + return if (result == 3) "OK" else "FAIL $result" +} \ No newline at end of file diff --git a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/epam.txt b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/epam.txt new file mode 100644 index 00000000000..b83e5db5941 --- /dev/null +++ b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/epam.txt @@ -0,0 +1,82 @@ +@kotlin.Metadata +public final class EpamKt$box$1$invokeSuspend$$inlined$zip$1 { + synthetic final field $source1: MyDeferred + synthetic final field $source2: MyDeferred + field L$0: java.lang.Object + field label: int + inner class EpamKt$box$1$invokeSuspend$$inlined$zip$1 + public method (p0: MyDeferred, p1: MyDeferred, p2: kotlin.coroutines.Continuation): void + public final @org.jetbrains.annotations.NotNull method create(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.Continuation): kotlin.coroutines.Continuation + public final method invoke(p0: java.lang.Object): java.lang.Object + public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object +} + +@kotlin.coroutines.jvm.internal.DebugMetadata +@kotlin.Metadata +final class EpamKt$box$1 { + synthetic final field $first: MyDeferred + synthetic final field $result: kotlin.jvm.internal.Ref$IntRef + synthetic final field $second: MyDeferred + field L$0: java.lang.Object + field label: int + inner class EpamKt$box$1 + method (p0: kotlin.jvm.internal.Ref$IntRef, p1: MyDeferred, p2: MyDeferred, p3: kotlin.coroutines.Continuation): void + public final @org.jetbrains.annotations.NotNull method create(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.Continuation): kotlin.coroutines.Continuation + public final method invoke(p0: java.lang.Object): java.lang.Object + public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object +} + +@kotlin.coroutines.jvm.internal.DebugMetadata +@kotlin.Metadata +final class EpamKt$box$first$1 { + field label: int + inner class EpamKt$box$first$1 + method (p0: kotlin.coroutines.Continuation): void + public final @org.jetbrains.annotations.NotNull method create(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.Continuation): kotlin.coroutines.Continuation + public final method invoke(p0: java.lang.Object): java.lang.Object + public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object +} + +@kotlin.coroutines.jvm.internal.DebugMetadata +@kotlin.Metadata +final class EpamKt$box$second$1 { + field label: int + inner class EpamKt$box$second$1 + method (p0: kotlin.coroutines.Continuation): void + public final @org.jetbrains.annotations.NotNull method create(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.Continuation): kotlin.coroutines.Continuation + public final method invoke(p0: java.lang.Object): java.lang.Object + public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object +} + +@kotlin.Metadata +public final class EpamKt$zip$1 { + synthetic final field $source1: MyDeferred + synthetic final field $source2: MyDeferred + synthetic final field $zipper: kotlin.jvm.functions.Function2 + field label: int + inner class EpamKt$zip$1 + public method (p0: kotlin.jvm.functions.Function2, p1: MyDeferred, p2: MyDeferred, p3: kotlin.coroutines.Continuation): void + public final @org.jetbrains.annotations.NotNull method create(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.Continuation): kotlin.coroutines.Continuation + public final method invoke(p0: java.lang.Object): java.lang.Object + public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object +} + +@kotlin.Metadata +public final class EpamKt { + inner class EpamKt$box$1 + inner class EpamKt$box$first$1 + inner class EpamKt$box$second$1 + inner class EpamKt$zip$1 + public final static @org.jetbrains.annotations.NotNull method async(@org.jetbrains.annotations.NotNull p0: kotlin.jvm.functions.Function1): MyDeferred + public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String + public final static method builder(@org.jetbrains.annotations.NotNull p0: kotlin.jvm.functions.Function1): void + public final static @org.jetbrains.annotations.NotNull method zip(@org.jetbrains.annotations.NotNull p0: MyDeferred, @org.jetbrains.annotations.NotNull p1: MyDeferred, @org.jetbrains.annotations.NotNull p2: kotlin.jvm.functions.Function2): MyDeferred +} + +@kotlin.Metadata +public final class MyDeferred { + private final @org.jetbrains.annotations.NotNull field t: kotlin.jvm.functions.Function1 + public method (@org.jetbrains.annotations.NotNull p0: kotlin.jvm.functions.Function1): void + public final @org.jetbrains.annotations.Nullable method await(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.Continuation): java.lang.Object + public final @org.jetbrains.annotations.NotNull method getT(): kotlin.jvm.functions.Function1 +} diff --git a/compiler/testData/codegen/box/coroutines/tailCallOptimizations/epam_1_2.txt b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/epam_1_2.txt new file mode 100644 index 00000000000..b577a90d507 --- /dev/null +++ b/compiler/testData/codegen/box/coroutines/tailCallOptimizations/epam_1_2.txt @@ -0,0 +1,74 @@ +@kotlin.Metadata +public final class EpamKt$box$1$doResume$$inlined$zip$1 { + synthetic final field $source1: MyDeferred + synthetic final field $source2: MyDeferred + field L$0: java.lang.Object + inner class EpamKt$box$1$doResume$$inlined$zip$1 + public method (p0: MyDeferred, p1: MyDeferred, p2: kotlin.coroutines.experimental.Continuation): void + public final @org.jetbrains.annotations.NotNull method create(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.experimental.Continuation): kotlin.coroutines.experimental.Continuation + public final @org.jetbrains.annotations.Nullable method doResume(@org.jetbrains.annotations.Nullable p0: java.lang.Object, @org.jetbrains.annotations.Nullable p1: java.lang.Throwable): java.lang.Object + public final method invoke(p0: java.lang.Object): java.lang.Object +} + +@kotlin.Metadata +final class EpamKt$box$1 { + synthetic final field $first: MyDeferred + synthetic final field $result: kotlin.jvm.internal.Ref$IntRef + synthetic final field $second: MyDeferred + field L$0: java.lang.Object + inner class EpamKt$box$1 + method (p0: kotlin.jvm.internal.Ref$IntRef, p1: MyDeferred, p2: MyDeferred, p3: kotlin.coroutines.experimental.Continuation): void + public final @org.jetbrains.annotations.NotNull method create(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.experimental.Continuation): kotlin.coroutines.experimental.Continuation + public final @org.jetbrains.annotations.Nullable method doResume(@org.jetbrains.annotations.Nullable p0: java.lang.Object, @org.jetbrains.annotations.Nullable p1: java.lang.Throwable): java.lang.Object + public final method invoke(p0: java.lang.Object): java.lang.Object +} + +@kotlin.Metadata +final class EpamKt$box$first$1 { + inner class EpamKt$box$first$1 + method (p0: kotlin.coroutines.experimental.Continuation): void + public final @org.jetbrains.annotations.NotNull method create(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.experimental.Continuation): kotlin.coroutines.experimental.Continuation + public final @org.jetbrains.annotations.Nullable method doResume(@org.jetbrains.annotations.Nullable p0: java.lang.Object, @org.jetbrains.annotations.Nullable p1: java.lang.Throwable): java.lang.Object + public final method invoke(p0: java.lang.Object): java.lang.Object +} + +@kotlin.Metadata +final class EpamKt$box$second$1 { + inner class EpamKt$box$second$1 + method (p0: kotlin.coroutines.experimental.Continuation): void + public final @org.jetbrains.annotations.NotNull method create(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.experimental.Continuation): kotlin.coroutines.experimental.Continuation + public final @org.jetbrains.annotations.Nullable method doResume(@org.jetbrains.annotations.Nullable p0: java.lang.Object, @org.jetbrains.annotations.Nullable p1: java.lang.Throwable): java.lang.Object + public final method invoke(p0: java.lang.Object): java.lang.Object +} + +@kotlin.Metadata +public final class EpamKt$zip$1 { + synthetic final field $source1: MyDeferred + synthetic final field $source2: MyDeferred + synthetic final field $zipper: kotlin.jvm.functions.Function2 + inner class EpamKt$zip$1 + public method (p0: kotlin.jvm.functions.Function2, p1: MyDeferred, p2: MyDeferred, p3: kotlin.coroutines.experimental.Continuation): void + public final @org.jetbrains.annotations.NotNull method create(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.experimental.Continuation): kotlin.coroutines.experimental.Continuation + public final @org.jetbrains.annotations.Nullable method doResume(@org.jetbrains.annotations.Nullable p0: java.lang.Object, @org.jetbrains.annotations.Nullable p1: java.lang.Throwable): java.lang.Object + public final method invoke(p0: java.lang.Object): java.lang.Object +} + +@kotlin.Metadata +public final class EpamKt { + inner class EpamKt$box$1 + inner class EpamKt$box$first$1 + inner class EpamKt$box$second$1 + inner class EpamKt$zip$1 + public final static @org.jetbrains.annotations.NotNull method async(@org.jetbrains.annotations.NotNull p0: kotlin.jvm.functions.Function1): MyDeferred + public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String + public final static method builder(@org.jetbrains.annotations.NotNull p0: kotlin.jvm.functions.Function1): void + public final static @org.jetbrains.annotations.NotNull method zip(@org.jetbrains.annotations.NotNull p0: MyDeferred, @org.jetbrains.annotations.NotNull p1: MyDeferred, @org.jetbrains.annotations.NotNull p2: kotlin.jvm.functions.Function2): MyDeferred +} + +@kotlin.Metadata +public final class MyDeferred { + private final @org.jetbrains.annotations.NotNull field t: kotlin.jvm.functions.Function1 + public method (@org.jetbrains.annotations.NotNull p0: kotlin.jvm.functions.Function1): void + public final @org.jetbrains.annotations.Nullable method await(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.experimental.Continuation): java.lang.Object + public final @org.jetbrains.annotations.NotNull method getT(): kotlin.jvm.functions.Function1 +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index c9c5d2b8953..ed03b8dab20 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -8042,6 +8042,16 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline.kt", "kotlin.coroutines"); } + @TestMetadata("epam.kt") + public void testEpam_1_2() throws Exception { + runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/tailCallOptimizations/epam.kt", "kotlin.coroutines.experimental"); + } + + @TestMetadata("epam.kt") + public void testEpam_1_3() throws Exception { + runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/tailCallOptimizations/epam.kt", "kotlin.coroutines"); + } + @TestMetadata("inlineWithStateMachine.kt") public void testInlineWithStateMachine_1_2() throws Exception { runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/tailCallOptimizations/inlineWithStateMachine.kt", "kotlin.coroutines.experimental"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index e56cdfd5697..889768c1dc8 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -8042,6 +8042,16 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline.kt", "kotlin.coroutines"); } + @TestMetadata("epam.kt") + public void testEpam_1_2() throws Exception { + runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/tailCallOptimizations/epam.kt", "kotlin.coroutines.experimental"); + } + + @TestMetadata("epam.kt") + public void testEpam_1_3() throws Exception { + runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/tailCallOptimizations/epam.kt", "kotlin.coroutines"); + } + @TestMetadata("inlineWithStateMachine.kt") public void testInlineWithStateMachine_1_2() throws Exception { runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/tailCallOptimizations/inlineWithStateMachine.kt", "kotlin.coroutines.experimental"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 9853232f9c4..f19fc7d4185 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -8042,6 +8042,16 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline.kt", "kotlin.coroutines"); } + @TestMetadata("epam.kt") + public void testEpam_1_2() throws Exception { + runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/tailCallOptimizations/epam.kt", "kotlin.coroutines.experimental"); + } + + @TestMetadata("epam.kt") + public void testEpam_1_3() throws Exception { + runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/tailCallOptimizations/epam.kt", "kotlin.coroutines"); + } + @TestMetadata("inlineWithStateMachine.kt") public void testInlineWithStateMachine_1_2() throws Exception { runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/tailCallOptimizations/inlineWithStateMachine.kt", "kotlin.coroutines.experimental"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java index d491c4eac18..fb61d5815a1 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrJsCodegenBoxTestGenerated.java @@ -6067,6 +6067,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline.kt", "kotlin.coroutines"); } + @TestMetadata("epam.kt") + public void testEpam_1_3() throws Exception { + runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/tailCallOptimizations/epam.kt", "kotlin.coroutines"); + } + @TestMetadata("inlineWithStateMachine.kt") public void testInlineWithStateMachine_1_3() throws Exception { runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/tailCallOptimizations/inlineWithStateMachine.kt", "kotlin.coroutines"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index e5c7eb06071..9f5a959e6ed 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -7072,6 +7072,16 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/tailCallOptimizations/crossinline.kt", "kotlin.coroutines"); } + @TestMetadata("epam.kt") + public void testEpam_1_2() throws Exception { + runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/tailCallOptimizations/epam.kt", "kotlin.coroutines.experimental"); + } + + @TestMetadata("epam.kt") + public void testEpam_1_3() throws Exception { + runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/tailCallOptimizations/epam.kt", "kotlin.coroutines"); + } + @TestMetadata("inlineWithStateMachine.kt") public void testInlineWithStateMachine_1_2() throws Exception { runTestWithPackageReplacement("compiler/testData/codegen/box/coroutines/tailCallOptimizations/inlineWithStateMachine.kt", "kotlin.coroutines.experimental");