Loosen tail call check
Check that any source of ARETURN is inside a suspension point, not all of them. #KT-27190 Fixed
This commit is contained in:
+1
-2
@@ -21,7 +21,6 @@ import org.jetbrains.kotlin.codegen.optimization.transformer.MethodTransformer
|
|||||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.config.isReleaseCoroutines
|
import org.jetbrains.kotlin.config.isReleaseCoroutines
|
||||||
import org.jetbrains.kotlin.diagnostics.DiagnosticSink
|
import org.jetbrains.kotlin.diagnostics.DiagnosticSink
|
||||||
import org.jetbrains.kotlin.load.java.JvmAbi
|
|
||||||
import org.jetbrains.kotlin.psi.KtElement
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
import org.jetbrains.kotlin.resolve.jvm.AsmTypes
|
import org.jetbrains.kotlin.resolve.jvm.AsmTypes
|
||||||
import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm
|
import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm
|
||||||
@@ -948,7 +947,7 @@ private fun allSuspensionPointsAreTailCalls(
|
|||||||
safelyReachableReturns[endIndex + 1]?.all { returnIndex ->
|
safelyReachableReturns[endIndex + 1]?.all { returnIndex ->
|
||||||
sourceFrames[returnIndex].top().sure {
|
sourceFrames[returnIndex].top().sure {
|
||||||
"There must be some value on stack to return"
|
"There must be some value on stack to return"
|
||||||
}.insns.all { sourceInsn ->
|
}.insns.any { sourceInsn ->
|
||||||
sourceInsn?.let(instructions::indexOf) in beginIndex..endIndex
|
sourceInsn?.let(instructions::indexOf) in beginIndex..endIndex
|
||||||
}
|
}
|
||||||
} ?: false
|
} ?: false
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// COMMON_COROUTINES_TEST
|
||||||
|
|
||||||
|
import COROUTINES_PACKAGE.intrinsics.*
|
||||||
|
|
||||||
|
fun check() = true
|
||||||
|
|
||||||
|
suspend fun f(i: Int): Unit {
|
||||||
|
return f_2()
|
||||||
|
}
|
||||||
|
|
||||||
|
private inline suspend fun f_2(): Unit {
|
||||||
|
if (check()) return
|
||||||
|
return suspendCoroutineUninterceptedOrReturn {
|
||||||
|
COROUTINE_SUSPENDED
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
@kotlin.Metadata
|
||||||
|
public final class TailCallIfReturnUnitKt {
|
||||||
|
public final static method check(): boolean
|
||||||
|
public final static @org.jetbrains.annotations.Nullable method f(p0: int, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.experimental.Continuation): java.lang.Object
|
||||||
|
private synthetic final static method f_2(p0: kotlin.coroutines.experimental.Continuation): java.lang.Object
|
||||||
|
}
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
@kotlin.Metadata
|
||||||
|
public final class TailCallIfReturnUnitKt {
|
||||||
|
public final static method check(): boolean
|
||||||
|
public final static @org.jetbrains.annotations.Nullable method f(p0: int, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): java.lang.Object
|
||||||
|
private synthetic final static method f_2(p0: kotlin.coroutines.Continuation): java.lang.Object
|
||||||
|
}
|
||||||
+10
@@ -498,6 +498,16 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest {
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/bytecodeListing/tailcall"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/bytecodeListing/tailcall"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("tailCallIfReturnUnit.kt")
|
||||||
|
public void testTailCallIfReturnUnit_1_2() throws Exception {
|
||||||
|
runTestWithPackageReplacement("compiler/testData/codegen/bytecodeListing/tailcall/tailCallIfReturnUnit.kt", "kotlin.coroutines.experimental");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("tailCallIfReturnUnit.kt")
|
||||||
|
public void testTailCallIfReturnUnit_1_3() throws Exception {
|
||||||
|
runTestWithPackageReplacement("compiler/testData/codegen/bytecodeListing/tailcall/tailCallIfReturnUnit.kt", "kotlin.coroutines");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("tailCallIntrinsics.kt")
|
@TestMetadata("tailCallIntrinsics.kt")
|
||||||
public void testTailCallIntrinsics_1_2() throws Exception {
|
public void testTailCallIntrinsics_1_2() throws Exception {
|
||||||
runTestWithPackageReplacement("compiler/testData/codegen/bytecodeListing/tailcall/tailCallIntrinsics.kt", "kotlin.coroutines.experimental");
|
runTestWithPackageReplacement("compiler/testData/codegen/bytecodeListing/tailcall/tailCallIntrinsics.kt", "kotlin.coroutines.experimental");
|
||||||
|
|||||||
Reference in New Issue
Block a user