diff --git a/kotlinx-coroutines-core/common/src/internal/DispatchedTask.kt b/kotlinx-coroutines-core/common/src/internal/DispatchedTask.kt index 9588d22b17..32258ba101 100644 --- a/kotlinx-coroutines-core/common/src/internal/DispatchedTask.kt +++ b/kotlinx-coroutines-core/common/src/internal/DispatchedTask.kt @@ -117,7 +117,7 @@ internal fun DispatchedTask.resume(delegate: Continuation, useMode: In // slow-path - use delegate val state = takeState() val exception = getExceptionalResult(state)?.let { recoverStackTrace(it, delegate) } - val result = if (exception != null) Result.failure(exception) else Result.success(state as T) + val result = if (exception != null) Result.failure(exception) else Result.success(getSuccessfulResult(state)) when (useMode) { MODE_ATOMIC_DEFAULT -> delegate.resumeWith(result) MODE_CANCELLABLE -> delegate.resumeCancellableWith(result) diff --git a/kotlinx-coroutines-core/common/test/CancellableResumeTest.kt b/kotlinx-coroutines-core/common/test/CancellableResumeTest.kt index b2cde6b978..56df709f37 100644 --- a/kotlinx-coroutines-core/common/test/CancellableResumeTest.kt +++ b/kotlinx-coroutines-core/common/test/CancellableResumeTest.kt @@ -119,4 +119,16 @@ class CancellableResumeTest : TestBase() { yield() // to coroutine -- throws cancellation exception finish(9) } + + + @Test + fun testResumeUnconfined() = runTest { + val outerScope = this + withContext(Dispatchers.Unconfined) { + val result = suspendCancellableCoroutine { + outerScope.launch { it.resume("OK", {}) } + } + assertEquals("OK", result) + } + } } \ No newline at end of file