diff --git a/src/rt/rust_task.cpp b/src/rt/rust_task.cpp index 9c2d8824b34..5164f6ac181 100644 --- a/src/rt/rust_task.cpp +++ b/src/rt/rust_task.cpp @@ -191,6 +191,13 @@ void task_start_wrapper(spawn_args *a) task->free(env); } + task->die(); + + if (task->killed && !failed) { + LOG(task, task, "Task killed during termination"); + failed = true; + } + if (failed) { #ifndef __WIN32__ task->conclude_failure(); @@ -198,7 +205,6 @@ void task_start_wrapper(spawn_args *a) A(task->sched, false, "Shouldn't happen"); #endif } else { - task->die(); task->lock.lock(); task->notify_tasks_waiting_to_join(); task->lock.unlock(); @@ -316,13 +322,13 @@ rust_task::fail() { #ifndef __WIN32__ throw this; #else + die(); conclude_failure(); #endif } void rust_task::conclude_failure() { - die(); // Unblock the task so it can unwind. unblock(); fail_parent(); diff --git a/src/test/run-fail/spawnfail.rs b/src/test/run-fail/spawnfail.rs index e93cff723b2..a4fcffb43f7 100644 --- a/src/test/run-fail/spawnfail.rs +++ b/src/test/run-fail/spawnfail.rs @@ -1,13 +1,12 @@ -// xfail-test +// xfail-win32 // error-pattern:explicit use std; import std::task; // We don't want to see any invalid reads fn main() { - fn f() { + fn f(&&_i: ()) { fail; } - let g = f; - task::spawn(g); + task::spawn((), f); } \ No newline at end of file