[libcxx-commits] [libcxx] [libcxx] Test `await_suspend` control flow & `coro_await_suspend_destroy` attr (PR #152820)

via libcxx-commits libcxx-commits at lists.llvm.org
Fri Aug 8 19:29:08 PDT 2025


https://github.com/snarkmaster created https://github.com/llvm/llvm-project/pull/152820

When reviewing https://github.com/llvm/llvm-project/pull/152623, @@ChuanqiXu9 suggested that it's better to separate `clang` and `libcxx` changes, so I did that here.

This event-replay test is compatible with compilers lacking the new attribute `[[clang::coro_await_suspend_destroy]]`. The two PRs can be landed in any order.

The test does not just verify the attribute's correct behavior. By comparing "gold" event traces, it also provides some "change detector" protection against future breakage in the complex control flow of the main C++ coroutine implementation. Since suspension remains an area of active optimization work, such bugs are not ruled out.  For example, as a new contributor to LLVM, I made (and fixed) 2 control-flow bugs while working on #152623.  This test would've caught both.

>From 1b55fdee501bd89f7be4609086c7a04704f550f5 Mon Sep 17 00:00:00 2001
From: Alexey <snarkmaster at gmail.com>
Date: Fri, 8 Aug 2025 19:13:10 -0700
Subject: [PATCH] [libcxx] Change-detector for `await_suspend` control flow &
 end-to-end test for [[clang::coro_await_suspend_destroy]]

When reviewing https://github.com/llvm/llvm-project/pull/152623, @@ChuanqiXu9
suggested that it's better to separate `clang` and `libcxx` changes, so I did
that here.

This event-replay test is compatible with compilers lacking the new attribute.
The two PRs can be landed in any order.

Furthermore, the test does not just verify the attribute's correct behavior.
By storing "gold" event traces, it also provides some protection against future
breakage in the complex control flow of the C++ coroutine implementation.
Since suspension remains an area of active optimization work, such bugs are not
ruled out.  As a new contributor to LLVM, I myself made (and fixed) 2
control-flow bugs while working on #152623.  This test would've caught both.
---
 ..._await_suspend_destroy.golden-exceptions.h | 1163 +++++++++++++++++
 ...ait_suspend_destroy.golden-no-exceptions.h | 1156 ++++++++++++++++
 .../coro_await_suspend_destroy.pass.cpp       |  560 ++++++++
 3 files changed, 2879 insertions(+)
 create mode 100644 libcxx/test/std/language.support/support.coroutines/end.to.end/coro_await_suspend_destroy.golden-exceptions.h
 create mode 100644 libcxx/test/std/language.support/support.coroutines/end.to.end/coro_await_suspend_destroy.golden-no-exceptions.h
 create mode 100644 libcxx/test/std/language.support/support.coroutines/end.to.end/coro_await_suspend_destroy.pass.cpp

diff --git a/libcxx/test/std/language.support/support.coroutines/end.to.end/coro_await_suspend_destroy.golden-exceptions.h b/libcxx/test/std/language.support/support.coroutines/end.to.end/coro_await_suspend_destroy.golden-exceptions.h
new file mode 100644
index 0000000000000..2911e97ad9f59
--- /dev/null
+++ b/libcxx/test/std/language.support/support.coroutines/end.to.end/coro_await_suspend_destroy.golden-exceptions.h
@@ -0,0 +1,1163 @@
+// coro_await_suspend_destroy.golden-exceptions.h
++ test_coro_shortcircuits_to_empty(std::vector<test_driver>{
+    {.toggles_    = 0,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 18,
+     .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 65}},
+    {.toggles_    = 1,
+     .threw_      = 1,
+     .result_     = -1,
+     .next_event_ = 19,
+     .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 81, 65}},
+    {.toggles_    = 2,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 18,
+     .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 65}},
+    {.toggles_    = 3,
+     .threw_      = 1,
+     .result_     = -1,
+     .next_event_ = 19,
+     .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 81, 65}},
+    {.toggles_    = 4,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 15,
+     .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+    {.toggles_    = 5,
+     .threw_      = 1,
+     .result_     = -1,
+     .next_event_ = 16,
+     .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+    {.toggles_    = 6,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 15,
+     .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+    {.toggles_    = 7,
+     .threw_      = 1,
+     .result_     = -1,
+     .next_event_ = 16,
+     .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+    {.toggles_    = 8,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 22,
+     .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 72, 69, 66, 64, 65}},
+    {.toggles_    = 9,
+     .threw_      = 1,
+     .result_     = -1,
+     .next_event_ = 23,
+     .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 72, 69, 66, 64, 81, 65}},
+    {.toggles_    = 10,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 22,
+     .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 72, 69, 66, 64, 65}},
+    {.toggles_    = 11,
+     .threw_      = 1,
+     .result_     = -1,
+     .next_event_ = 23,
+     .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 72, 69, 66, 64, 81, 65}},
+    {.toggles_    = 12,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 15,
+     .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+    {.toggles_    = 13,
+     .threw_      = 1,
+     .result_     = -1,
+     .next_event_ = 16,
+     .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+    {.toggles_    = 14,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 15,
+     .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+    {.toggles_    = 15,
+     .threw_      = 1,
+     .result_     = -1,
+     .next_event_ = 16,
+     .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+    {.toggles_    = 16,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 18,
+     .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 65}},
+    {.toggles_    = 17,
+     .threw_      = 1,
+     .result_     = -1,
+     .next_event_ = 19,
+     .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 81, 65}},
+    {.toggles_    = 18,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 18,
+     .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 65}},
+    {.toggles_    = 19,
+     .threw_      = 1,
+     .result_     = -1,
+     .next_event_ = 19,
+     .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 81, 65}},
+    {.toggles_    = 20,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 15,
+     .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+    {.toggles_    = 21,
+     .threw_      = 1,
+     .result_     = -1,
+     .next_event_ = 16,
+     .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+    {.toggles_    = 22,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 15,
+     .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+    {.toggles_    = 23,
+     .threw_      = 1,
+     .result_     = -1,
+     .next_event_ = 16,
+     .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+    {.toggles_    = 24,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 22,
+     .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 72, 69, 66, 64, 65}},
+    {.toggles_    = 25,
+     .threw_      = 1,
+     .result_     = -1,
+     .next_event_ = 23,
+     .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 72, 69, 66, 64, 81, 65}},
+    {.toggles_    = 26,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 22,
+     .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 72, 69, 66, 64, 65}},
+    {.toggles_    = 27,
+     .threw_      = 1,
+     .result_     = -1,
+     .next_event_ = 23,
+     .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 72, 69, 66, 64, 81, 65}},
+    {.toggles_    = 28,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 15,
+     .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+    {.toggles_    = 29,
+     .threw_      = 1,
+     .result_     = -1,
+     .next_event_ = 16,
+     .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+    {.toggles_    = 30,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 15,
+     .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+    {.toggles_    = 31,
+     .threw_      = 1,
+     .result_     = -1,
+     .next_event_ = 16,
+     .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+}) +
+    test_coro_simple_await(std::vector<test_driver>{
+        {.toggles_    = 0,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 20,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 75, 2, 75, 1, 69, 66, 64, 65}},
+        {.toggles_    = 1,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 75, 2, 75, 1, 69, 66, 64, 81, 65}},
+        {.toggles_    = 2,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 22,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 71, 75, 2, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 3,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 23,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 71, 75, 2, 75, 1, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 4,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 15,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 5,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 6,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 15,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 7,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 8,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 20,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 75, 2, 75, 1, 69, 66, 64, 65}},
+        {.toggles_    = 9,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 75, 2, 75, 1, 69, 66, 64, 81, 65}},
+        {.toggles_    = 10,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 22,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 71, 75, 2, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 11,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 23,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 71, 75, 2, 75, 1, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 12,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 15,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 13,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 14,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 15,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 15,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 16,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 18,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 17,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 19,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+        {.toggles_    = 18,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 18,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 19,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 19,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+        {.toggles_    = 20,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 15,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 21,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 22,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 15,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 23,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 24,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 22,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 25,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 23,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 26,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 22,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 27,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 23,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 28,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 15,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 29,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 30,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 15,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 31,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+    }) +
+    test_coro_catching_shortcircuits_to_empty(std::vector<test_driver>{
+        {.toggles_    = 0,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 18,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 65}},
+        {.toggles_    = 1,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 19,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 81, 65}},
+        {.toggles_    = 2,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 18,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 65}},
+        {.toggles_    = 3,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 19,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 81, 65}},
+        {.toggles_    = 4,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 65}},
+        {.toggles_    = 5,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 17,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 6,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 65}},
+        {.toggles_    = 7,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 17,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 8,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 23,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 80, 72, 69, 66, 64, 65}},
+        {.toggles_    = 9,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 24,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 80, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 10,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 23,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 80, 72, 69, 66, 64, 65}},
+        {.toggles_    = 11,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 24,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 80, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 12,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 65}},
+        {.toggles_    = 13,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 17,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 14,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 65}},
+        {.toggles_    = 15,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 17,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 16,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 18,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 65}},
+        {.toggles_    = 17,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 19,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 81, 65}},
+        {.toggles_    = 18,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 18,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 65}},
+        {.toggles_    = 19,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 19,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 81, 65}},
+        {.toggles_    = 20,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 65}},
+        {.toggles_    = 21,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 17,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 22,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 65}},
+        {.toggles_    = 23,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 17,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 24,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 23,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 80, 72, 69, 66, 64, 65}},
+        {.toggles_    = 25,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 24,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 80, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 26,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 23,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 80, 72, 69, 66, 64, 65}},
+        {.toggles_    = 27,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 24,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 80, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 28,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 65}},
+        {.toggles_    = 29,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 17,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 30,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 65}},
+        {.toggles_    = 31,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 17,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 81, 65}},
+    }) +
+    test_coro_catching_simple_await(std::vector<test_driver>{
+        {.toggles_    = 0,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 20,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 75, 2, 75, 1, 69, 66, 64, 65}},
+        {.toggles_    = 1,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 75, 2, 75, 1, 69, 66, 64, 81, 65}},
+        {.toggles_    = 2,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 23,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 71, 75, 2, 75, 1, 80, 72, 69, 66, 64, 65}},
+        {.toggles_    = 3,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 24,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 71, 75, 2, 75, 1, 80, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 4,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 65}},
+        {.toggles_    = 5,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 17,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 6,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 65}},
+        {.toggles_    = 7,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 17,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 8,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 20,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 75, 2, 75, 1, 69, 66, 64, 65}},
+        {.toggles_    = 9,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 75, 2, 75, 1, 69, 66, 64, 81, 65}},
+        {.toggles_    = 10,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 23,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 71, 75, 2, 75, 1, 80, 72, 69, 66, 64, 65}},
+        {.toggles_    = 11,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 24,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 71, 75, 2, 75, 1, 80, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 12,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 65}},
+        {.toggles_    = 13,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 17,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 14,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 65}},
+        {.toggles_    = 15,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 17,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 16,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 18,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 17,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 19,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+        {.toggles_    = 18,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 18,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 19,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 19,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+        {.toggles_    = 20,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 65}},
+        {.toggles_    = 21,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 17,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 22,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 65}},
+        {.toggles_    = 23,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 17,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 24,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 23,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 80, 72, 69, 66, 64, 65}},
+        {.toggles_    = 25,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 24,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 80, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 26,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 23,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 80, 72, 69, 66, 64, 65}},
+        {.toggles_    = 27,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 24,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 80, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 28,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 65}},
+        {.toggles_    = 29,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 17,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 30,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 65}},
+        {.toggles_    = 31,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 17,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 80, 72, 69, 66, 64, 81, 65}},
+    }) +
+    test_noneliding_coro_shortcircuits_to_empty(std::vector<test_driver>{
+        {.toggles_    = 0,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 24,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 74, 2, 75, 2, 73, 3, 79, 77, 3, 75, 3, 66, 64, 65}},
+        {.toggles_    = 1,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 25,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 74, 2, 75, 2, 73, 3, 79, 77, 3, 75, 3, 66, 64, 81, 65}},
+        {.toggles_    = 2,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 24,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 74, 2, 75, 2, 73, 3, 79, 77, 3, 75, 3, 66, 64, 65}},
+        {.toggles_    = 3,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 25,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 74, 2, 75, 2, 73, 3, 79, 77, 3, 75, 3, 66, 64, 81, 65}},
+        {.toggles_    = 4,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 15,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 5,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 6,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 15,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 7,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 8,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 28,
+         .events_     = {67, 68, 73, 1,  74, 1,  75, 1,  73, 2,  74, 2,  75, 2,
+                         73, 3,  79, 77, 3,  78, 3,  75, 3,  72, 69, 66, 64, 65}},
+        {.toggles_    = 9,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 29,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2,  74, 2,  75, 2, 73,
+                         3,  79, 77, 3, 78, 3, 75, 3, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 10,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 28,
+         .events_     = {67, 68, 73, 1,  74, 1,  75, 1,  73, 2,  74, 2,  75, 2,
+                         73, 3,  79, 77, 3,  78, 3,  75, 3,  72, 69, 66, 64, 65}},
+        {.toggles_    = 11,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 29,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2,  74, 2,  75, 2, 73,
+                         3,  79, 77, 3, 78, 3, 75, 3, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 12,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 15,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 13,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 14,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 15,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 15,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 16,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 24,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 74, 2, 75, 2, 73, 3, 79, 77, 3, 75, 3, 66, 64, 65}},
+        {.toggles_    = 17,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 25,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 74, 2, 75, 2, 73, 3, 79, 77, 3, 75, 3, 66, 64, 81, 65}},
+        {.toggles_    = 18,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 24,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 74, 2, 75, 2, 73, 3, 79, 77, 3, 75, 3, 66, 64, 65}},
+        {.toggles_    = 19,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 25,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 74, 2, 75, 2, 73, 3, 79, 77, 3, 75, 3, 66, 64, 81, 65}},
+        {.toggles_    = 20,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 15,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 21,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 22,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 15,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 23,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 24,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 28,
+         .events_     = {67, 68, 73, 1,  74, 1,  75, 1,  73, 2,  74, 2,  75, 2,
+                         73, 3,  79, 77, 3,  78, 3,  75, 3,  72, 69, 66, 64, 65}},
+        {.toggles_    = 25,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 29,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2,  74, 2,  75, 2, 73,
+                         3,  79, 77, 3, 78, 3, 75, 3, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 26,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 28,
+         .events_     = {67, 68, 73, 1,  74, 1,  75, 1,  73, 2,  74, 2,  75, 2,
+                         73, 3,  79, 77, 3,  78, 3,  75, 3,  72, 69, 66, 64, 65}},
+        {.toggles_    = 27,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 29,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2,  74, 2,  75, 2, 73,
+                         3,  79, 77, 3, 78, 3, 75, 3, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 28,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 15,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 29,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 30,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 15,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 31,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+    }) +
+    test_noneliding_coro_simple_await(std::vector<test_driver>{
+        {.toggles_    = 0,
+         .threw_      = 0,
+         .result_     = 28,
+         .next_event_ = 26,
+         .events_ = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 73, 3, 74, 3, 70, 28, 75, 3, 75, 2, 75, 1, 69, 66, 64, 65}},
+        {.toggles_ = 1, .threw_ = 1, .result_ = -1, .next_event_ = 27, .events_ = {67, 68, 73, 1,  74, 1,  73, 2,  74,
+                                                                                   2,  73, 3,  74, 3,  70, 28, 75, 3,
+                                                                                   75, 2,  75, 1,  69, 66, 64, 81, 65}},
+        {.toggles_    = 2,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 28,
+         .events_     = {67, 68, 73, 1,  74, 1,  73, 2,  74, 2,  73, 3,  74, 3,
+                         70, 28, 71, 75, 3,  75, 2,  75, 1,  72, 69, 66, 64, 65}},
+        {.toggles_    = 3,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 29,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2,  73, 3,  74, 3, 70,
+                         28, 71, 75, 3, 75, 2, 75, 1, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 4,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 15,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 5,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 6,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 15,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 7,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 8,
+         .threw_      = 0,
+         .result_     = 28,
+         .next_event_ = 26,
+         .events_ = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 73, 3, 74, 3, 70, 28, 75, 3, 75, 2, 75, 1, 69, 66, 64, 65}},
+        {.toggles_ = 9, .threw_ = 1, .result_ = -1, .next_event_ = 27, .events_ = {67, 68, 73, 1,  74, 1,  73, 2,  74,
+                                                                                   2,  73, 3,  74, 3,  70, 28, 75, 3,
+                                                                                   75, 2,  75, 1,  69, 66, 64, 81, 65}},
+        {.toggles_    = 10,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 28,
+         .events_     = {67, 68, 73, 1,  74, 1,  73, 2,  74, 2,  73, 3,  74, 3,
+                         70, 28, 71, 75, 3,  75, 2,  75, 1,  72, 69, 66, 64, 65}},
+        {.toggles_    = 11,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 29,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2,  73, 3,  74, 3, 70,
+                         28, 71, 75, 3, 75, 2, 75, 1, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 12,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 15,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 13,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 14,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 15,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 15,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 16,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 18,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 17,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 19,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+        {.toggles_    = 18,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 18,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 19,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 19,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+        {.toggles_    = 20,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 15,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 21,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 22,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 15,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 23,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 24,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 22,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 25,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 23,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 26,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 22,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 27,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 23,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 28,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 15,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 29,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 30,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 15,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 65}},
+        {.toggles_    = 31,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 16,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 72, 69, 66, 64, 81, 65}},
+    }) +
+    test_nested_coroutines(std::vector<test_driver>{
+        {.toggles_    = 0,
+         .threw_      = 0,
+         .result_     = 48,
+         .next_event_ = 60,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 74, 33, 70, 24, 75, 33, 75, 32, 69, 66,
+                         64, 65, 73, 1,  74, 1,  75, 1,  67, 68, 73, 32, 74, 32, 73, 33, 74, 33, 70, 24,
+                         75, 33, 75, 32, 69, 66, 64, 65, 73, 2,  74, 2,  75, 2,  70, 48, 69, 66, 64, 65}},
+        {.toggles_    = 1,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 29,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 74, 33, 70, 24, 75,
+                         33, 75, 32, 69, 66, 64, 81, 65, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 2,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 34,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 74, 33, 70, 24, 71, 75, 33,
+                         75, 32, 72, 69, 66, 64, 65, 73, 1,  79, 77, 1,  75, 1,  66, 64, 65}},
+        {.toggles_    = 3,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 31,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 74, 33, 70, 24, 71, 75,
+                         33, 75, 32, 72, 69, 66, 64, 81, 65, 72, 69, 66, 64, 81, 65}},
+        {.toggles_ = 4, .threw_ = 0, .result_ = {}, .next_event_ = 27, .events_ = {67, 68, 67, 68, 73, 32, 74, 32, 76,
+                                                                                   32, 75, 32, 72, 69, 66, 64, 65, 73,
+                                                                                   1,  79, 77, 1,  75, 1,  66, 64, 65}},
+        {.toggles_    = 5,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 24,
+         .events_ = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 75, 32, 72, 69, 66, 64, 81, 65, 72, 69, 66, 64, 81, 65}},
+        {.toggles_ = 6, .threw_ = 0, .result_ = {}, .next_event_ = 27, .events_ = {67, 68, 67, 68, 73, 32, 74, 32, 76,
+                                                                                   32, 75, 32, 72, 69, 66, 64, 65, 73,
+                                                                                   1,  79, 77, 1,  75, 1,  66, 64, 65}},
+        {.toggles_    = 7,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 24,
+         .events_ = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 75, 32, 72, 69, 66, 64, 81, 65, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 8,
+         .threw_      = 0,
+         .result_     = 48,
+         .next_event_ = 60,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 74, 33, 70, 24, 75, 33, 75, 32, 69, 66,
+                         64, 65, 73, 1,  74, 1,  75, 1,  67, 68, 73, 32, 74, 32, 73, 33, 74, 33, 70, 24,
+                         75, 33, 75, 32, 69, 66, 64, 65, 73, 2,  74, 2,  75, 2,  70, 48, 69, 66, 64, 65}},
+        {.toggles_    = 9,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 29,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 74, 33, 70, 24, 75,
+                         33, 75, 32, 69, 66, 64, 81, 65, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 10,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 38,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 74, 33, 70, 24, 71, 75, 33, 75, 32,
+                         72, 69, 66, 64, 65, 73, 1,  79, 77, 1,  78, 1,  75, 1,  72, 69, 66, 64, 65}},
+        {.toggles_    = 11,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 31,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 74, 33, 70, 24, 71, 75,
+                         33, 75, 32, 72, 69, 66, 64, 81, 65, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 12,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 31,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 75, 32, 72, 69, 66, 64,
+                         65, 73, 1,  79, 77, 1,  78, 1,  75, 1,  72, 69, 66, 64, 65}},
+        {.toggles_    = 13,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 24,
+         .events_ = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 75, 32, 72, 69, 66, 64, 81, 65, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 14,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 31,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 75, 32, 72, 69, 66, 64,
+                         65, 73, 1,  79, 77, 1,  78, 1,  75, 1,  72, 69, 66, 64, 65}},
+        {.toggles_    = 15,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 24,
+         .events_ = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 75, 32, 72, 69, 66, 64, 81, 65, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 16,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 30,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 79, 77, 33, 75, 33,
+                         75, 32, 66, 64, 65, 73, 1,  79, 77, 1,  75, 1,  66, 64, 65}},
+        {.toggles_    = 17,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 27,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 79, 77, 33, 75,
+                         33, 75, 32, 66, 64, 81, 65, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 18,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 30,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 79, 77, 33, 75, 33,
+                         75, 32, 66, 64, 65, 73, 1,  79, 77, 1,  75, 1,  66, 64, 65}},
+        {.toggles_    = 19,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 27,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 79, 77, 33, 75,
+                         33, 75, 32, 66, 64, 81, 65, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 20,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 27,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 75, 32, 72, 69,
+                         66, 64, 65, 73, 1,  79, 77, 1,  75, 1,  66, 64, 65}},
+        {.toggles_    = 21,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 24,
+         .events_ = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 75, 32, 72, 69, 66, 64, 81, 65, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 22,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 27,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 75, 32, 72, 69,
+                         66, 64, 65, 73, 1,  79, 77, 1,  75, 1,  66, 64, 65}},
+        {.toggles_    = 23,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 24,
+         .events_ = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 75, 32, 72, 69, 66, 64, 81, 65, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 24,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 38,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 79, 77, 33, 78, 33, 75, 33, 75, 32,
+                         72, 69, 66, 64, 65, 73, 1,  79, 77, 1,  78, 1,  75, 1,  72, 69, 66, 64, 65}},
+        {.toggles_    = 25,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 31,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 79, 77, 33, 78, 33, 75,
+                         33, 75, 32, 72, 69, 66, 64, 81, 65, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 26,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 38,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 79, 77, 33, 78, 33, 75, 33, 75, 32,
+                         72, 69, 66, 64, 65, 73, 1,  79, 77, 1,  78, 1,  75, 1,  72, 69, 66, 64, 65}},
+        {.toggles_    = 27,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 31,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 79, 77, 33, 78, 33, 75,
+                         33, 75, 32, 72, 69, 66, 64, 81, 65, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 28,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 31,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 75, 32, 72, 69, 66, 64,
+                         65, 73, 1,  79, 77, 1,  78, 1,  75, 1,  72, 69, 66, 64, 65}},
+        {.toggles_    = 29,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 24,
+         .events_ = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 75, 32, 72, 69, 66, 64, 81, 65, 72, 69, 66, 64, 81, 65}},
+        {.toggles_    = 30,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 31,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 75, 32, 72, 69, 66, 64,
+                         65, 73, 1,  79, 77, 1,  78, 1,  75, 1,  72, 69, 66, 64, 65}},
+        {.toggles_    = 31,
+         .threw_      = 1,
+         .result_     = -1,
+         .next_event_ = 24,
+         .events_ = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 75, 32, 72, 69, 66, 64, 81, 65, 72, 69, 66, 64, 81, 65}},
+    })
diff --git a/libcxx/test/std/language.support/support.coroutines/end.to.end/coro_await_suspend_destroy.golden-no-exceptions.h b/libcxx/test/std/language.support/support.coroutines/end.to.end/coro_await_suspend_destroy.golden-no-exceptions.h
new file mode 100644
index 0000000000000..8478ac132136f
--- /dev/null
+++ b/libcxx/test/std/language.support/support.coroutines/end.to.end/coro_await_suspend_destroy.golden-no-exceptions.h
@@ -0,0 +1,1156 @@
+// coro_await_suspend_destroy.golden-no-exceptions.h
++ test_coro_shortcircuits_to_empty(std::vector<test_driver>{
+    {.toggles_    = 0,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 18,
+     .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 65}},
+    {.toggles_    = 1,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 19,
+     .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 81, 65}},
+    {.toggles_    = 2,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 18,
+     .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 65}},
+    {.toggles_    = 3,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 19,
+     .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 81, 65}},
+    {.toggles_ = 4, .threw_ = 0, .result_ = {}, .next_event_ = 20, .events_ = {67, 68, 73, 1,  74, 1,  76, 1,  75, 1,
+                                                                               73, 2,  79, 77, 2,  75, 2,  66, 64, 65}},
+    {.toggles_ = 5, .threw_ = 0, .result_ = {}, .next_event_ = 21, .events_ = {67, 68, 73, 1, 74, 1, 76, 1,  75, 1, 73,
+                                                                               2,  79, 77, 2, 75, 2, 66, 64, 81, 65}},
+    {.toggles_ = 6, .threw_ = 0, .result_ = {}, .next_event_ = 20, .events_ = {67, 68, 73, 1,  74, 1,  76, 1,  75, 1,
+                                                                               73, 2,  79, 77, 2,  75, 2,  66, 64, 65}},
+    {.toggles_ = 7, .threw_ = 0, .result_ = {}, .next_event_ = 21, .events_ = {67, 68, 73, 1, 74, 1, 76, 1,  75, 1, 73,
+                                                                               2,  79, 77, 2, 75, 2, 66, 64, 81, 65}},
+    {.toggles_ = 8, .threw_ = 0, .result_ = {}, .next_event_ = 20, .events_ = {67, 68, 73, 1,  74, 1,  75, 1,  73, 2,
+                                                                               79, 77, 2,  78, 2,  75, 2,  66, 64, 65}},
+    {.toggles_ = 9, .threw_ = 0, .result_ = {}, .next_event_ = 21, .events_ = {67, 68, 73, 1, 74, 1, 75, 1,  73, 2, 79,
+                                                                               77, 2,  78, 2, 75, 2, 66, 64, 81, 65}},
+    {.toggles_ = 10, .threw_ = 0, .result_ = {}, .next_event_ = 20, .events_ = {67, 68, 73, 1, 74, 1, 75, 1,  73, 2, 79,
+                                                                                77, 2,  78, 2, 75, 2, 66, 64, 65}},
+    {.toggles_ = 11, .threw_ = 0, .result_ = {}, .next_event_ = 21, .events_ = {67, 68, 73, 1, 74, 1, 75, 1,  73, 2, 79,
+                                                                                77, 2,  78, 2, 75, 2, 66, 64, 81, 65}},
+    {.toggles_    = 12,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 22,
+     .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 66, 64, 65}},
+    {.toggles_    = 13,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 23,
+     .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 66, 64, 81, 65}},
+    {.toggles_    = 14,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 22,
+     .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 66, 64, 65}},
+    {.toggles_    = 15,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 23,
+     .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 66, 64, 81, 65}},
+    {.toggles_    = 16,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 18,
+     .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 65}},
+    {.toggles_    = 17,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 19,
+     .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 81, 65}},
+    {.toggles_    = 18,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 18,
+     .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 65}},
+    {.toggles_    = 19,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 19,
+     .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 81, 65}},
+    {.toggles_ = 20, .threw_ = 0, .result_ = {}, .next_event_ = 20, .events_ = {67, 68, 73, 1, 74, 1, 76, 1,  75, 1, 73,
+                                                                                2,  79, 77, 2, 75, 2, 66, 64, 65}},
+    {.toggles_ = 21, .threw_ = 0, .result_ = {}, .next_event_ = 21, .events_ = {67, 68, 73, 1, 74, 1, 76, 1,  75, 1, 73,
+                                                                                2,  79, 77, 2, 75, 2, 66, 64, 81, 65}},
+    {.toggles_ = 22, .threw_ = 0, .result_ = {}, .next_event_ = 20, .events_ = {67, 68, 73, 1, 74, 1, 76, 1,  75, 1, 73,
+                                                                                2,  79, 77, 2, 75, 2, 66, 64, 65}},
+    {.toggles_ = 23, .threw_ = 0, .result_ = {}, .next_event_ = 21, .events_ = {67, 68, 73, 1, 74, 1, 76, 1,  75, 1, 73,
+                                                                                2,  79, 77, 2, 75, 2, 66, 64, 81, 65}},
+    {.toggles_ = 24, .threw_ = 0, .result_ = {}, .next_event_ = 20, .events_ = {67, 68, 73, 1, 74, 1, 75, 1,  73, 2, 79,
+                                                                                77, 2,  78, 2, 75, 2, 66, 64, 65}},
+    {.toggles_ = 25, .threw_ = 0, .result_ = {}, .next_event_ = 21, .events_ = {67, 68, 73, 1, 74, 1, 75, 1,  73, 2, 79,
+                                                                                77, 2,  78, 2, 75, 2, 66, 64, 81, 65}},
+    {.toggles_ = 26, .threw_ = 0, .result_ = {}, .next_event_ = 20, .events_ = {67, 68, 73, 1, 74, 1, 75, 1,  73, 2, 79,
+                                                                                77, 2,  78, 2, 75, 2, 66, 64, 65}},
+    {.toggles_ = 27, .threw_ = 0, .result_ = {}, .next_event_ = 21, .events_ = {67, 68, 73, 1, 74, 1, 75, 1,  73, 2, 79,
+                                                                                77, 2,  78, 2, 75, 2, 66, 64, 81, 65}},
+    {.toggles_    = 28,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 22,
+     .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 66, 64, 65}},
+    {.toggles_    = 29,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 23,
+     .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 66, 64, 81, 65}},
+    {.toggles_    = 30,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 22,
+     .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 66, 64, 65}},
+    {.toggles_    = 31,
+     .threw_      = 0,
+     .result_     = {},
+     .next_event_ = 23,
+     .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 66, 64, 81, 65}},
+}) +
+    test_coro_simple_await(std::vector<test_driver>{
+        {.toggles_    = 0,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 20,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 75, 2, 75, 1, 69, 66, 64, 65}},
+        {.toggles_    = 1,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 75, 2, 75, 1, 69, 66, 64, 81, 65}},
+        {.toggles_    = 2,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 71, 75, 2, 75, 1, 69, 66, 64, 65}},
+        {.toggles_    = 3,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 22,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 71, 75, 2, 75, 1, 69, 66, 64, 81, 65}},
+        {.toggles_    = 4,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 24,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 74, 2, 76, 2, 70, 12, 75, 2, 75, 1, 69, 66, 64, 65}},
+        {.toggles_    = 5,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 25,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 74, 2, 76, 2, 70, 12, 75, 2, 75, 1, 69, 66, 64, 81, 65}},
+        {.toggles_    = 6,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 25,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 74, 2, 76, 2, 70, 12, 71, 75, 2, 75, 1, 69, 66, 64, 65}},
+        {.toggles_    = 7,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 26,
+         .events_ = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 74, 2, 76, 2, 70, 12, 71, 75, 2, 75, 1, 69, 66, 64, 81, 65}},
+        {.toggles_    = 8,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 20,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 75, 2, 75, 1, 69, 66, 64, 65}},
+        {.toggles_    = 9,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 75, 2, 75, 1, 69, 66, 64, 81, 65}},
+        {.toggles_    = 10,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 71, 75, 2, 75, 1, 69, 66, 64, 65}},
+        {.toggles_    = 11,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 22,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 71, 75, 2, 75, 1, 69, 66, 64, 81, 65}},
+        {.toggles_    = 12,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 24,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 74, 2, 76, 2, 70, 12, 75, 2, 75, 1, 69, 66, 64, 65}},
+        {.toggles_    = 13,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 25,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 74, 2, 76, 2, 70, 12, 75, 2, 75, 1, 69, 66, 64, 81, 65}},
+        {.toggles_    = 14,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 25,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 74, 2, 76, 2, 70, 12, 71, 75, 2, 75, 1, 69, 66, 64, 65}},
+        {.toggles_    = 15,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 26,
+         .events_ = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 74, 2, 76, 2, 70, 12, 71, 75, 2, 75, 1, 69, 66, 64, 81, 65}},
+        {.toggles_    = 16,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 18,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 17,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 19,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+        {.toggles_    = 18,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 18,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 19,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 19,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+        {.toggles_    = 20,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 20,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 21,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+        {.toggles_    = 22,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 20,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 23,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+        {.toggles_    = 24,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 20,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 25,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+        {.toggles_    = 26,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 20,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 27,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+        {.toggles_    = 28,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 22,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 29,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 23,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+        {.toggles_    = 30,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 22,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 31,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 23,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+    }) +
+    test_coro_catching_shortcircuits_to_empty(std::vector<test_driver>{
+        {.toggles_    = 0,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 18,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 65}},
+        {.toggles_    = 1,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 19,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 81, 65}},
+        {.toggles_    = 2,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 18,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 65}},
+        {.toggles_    = 3,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 19,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 81, 65}},
+        {.toggles_    = 4,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 20,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 65}},
+        {.toggles_    = 5,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 81, 65}},
+        {.toggles_    = 6,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 20,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 65}},
+        {.toggles_    = 7,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 81, 65}},
+        {.toggles_    = 8,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 20,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 66, 64, 65}},
+        {.toggles_    = 9,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 66, 64, 81, 65}},
+        {.toggles_    = 10,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 20,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 66, 64, 65}},
+        {.toggles_    = 11,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 66, 64, 81, 65}},
+        {.toggles_    = 12,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 22,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 66, 64, 65}},
+        {.toggles_    = 13,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 23,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 66, 64, 81, 65}},
+        {.toggles_    = 14,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 22,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 66, 64, 65}},
+        {.toggles_    = 15,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 23,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 66, 64, 81, 65}},
+        {.toggles_    = 16,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 18,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 65}},
+        {.toggles_    = 17,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 19,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 81, 65}},
+        {.toggles_    = 18,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 18,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 65}},
+        {.toggles_    = 19,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 19,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 81, 65}},
+        {.toggles_    = 20,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 20,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 65}},
+        {.toggles_    = 21,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 81, 65}},
+        {.toggles_    = 22,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 20,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 65}},
+        {.toggles_    = 23,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 73, 2, 79, 77, 2, 75, 2, 66, 64, 81, 65}},
+        {.toggles_    = 24,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 20,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 66, 64, 65}},
+        {.toggles_    = 25,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 66, 64, 81, 65}},
+        {.toggles_    = 26,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 20,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 66, 64, 65}},
+        {.toggles_    = 27,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 66, 64, 81, 65}},
+        {.toggles_    = 28,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 22,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 66, 64, 65}},
+        {.toggles_    = 29,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 23,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 66, 64, 81, 65}},
+        {.toggles_    = 30,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 22,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 66, 64, 65}},
+        {.toggles_    = 31,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 23,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 75, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 66, 64, 81, 65}},
+    }) +
+    test_coro_catching_simple_await(std::vector<test_driver>{
+        {.toggles_    = 0,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 20,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 75, 2, 75, 1, 69, 66, 64, 65}},
+        {.toggles_    = 1,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 75, 2, 75, 1, 69, 66, 64, 81, 65}},
+        {.toggles_    = 2,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 71, 75, 2, 75, 1, 69, 66, 64, 65}},
+        {.toggles_    = 3,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 22,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 71, 75, 2, 75, 1, 69, 66, 64, 81, 65}},
+        {.toggles_    = 4,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 24,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 74, 2, 76, 2, 70, 12, 75, 2, 75, 1, 69, 66, 64, 65}},
+        {.toggles_    = 5,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 25,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 74, 2, 76, 2, 70, 12, 75, 2, 75, 1, 69, 66, 64, 81, 65}},
+        {.toggles_    = 6,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 25,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 74, 2, 76, 2, 70, 12, 71, 75, 2, 75, 1, 69, 66, 64, 65}},
+        {.toggles_    = 7,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 26,
+         .events_ = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 74, 2, 76, 2, 70, 12, 71, 75, 2, 75, 1, 69, 66, 64, 81, 65}},
+        {.toggles_    = 8,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 20,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 75, 2, 75, 1, 69, 66, 64, 65}},
+        {.toggles_    = 9,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 75, 2, 75, 1, 69, 66, 64, 81, 65}},
+        {.toggles_    = 10,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 71, 75, 2, 75, 1, 69, 66, 64, 65}},
+        {.toggles_    = 11,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 22,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 70, 12, 71, 75, 2, 75, 1, 69, 66, 64, 81, 65}},
+        {.toggles_    = 12,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 24,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 74, 2, 76, 2, 70, 12, 75, 2, 75, 1, 69, 66, 64, 65}},
+        {.toggles_    = 13,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 25,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 74, 2, 76, 2, 70, 12, 75, 2, 75, 1, 69, 66, 64, 81, 65}},
+        {.toggles_    = 14,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 25,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 74, 2, 76, 2, 70, 12, 71, 75, 2, 75, 1, 69, 66, 64, 65}},
+        {.toggles_    = 15,
+         .threw_      = 0,
+         .result_     = 12,
+         .next_event_ = 26,
+         .events_ = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 74, 2, 76, 2, 70, 12, 71, 75, 2, 75, 1, 69, 66, 64, 81, 65}},
+        {.toggles_    = 16,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 18,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 17,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 19,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+        {.toggles_    = 18,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 18,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 19,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 19,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+        {.toggles_    = 20,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 20,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 21,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+        {.toggles_    = 22,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 20,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 23,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+        {.toggles_    = 24,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 20,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 25,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+        {.toggles_    = 26,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 20,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 27,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+        {.toggles_    = 28,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 22,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 29,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 23,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+        {.toggles_    = 30,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 22,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 31,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 23,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+    }) +
+    test_noneliding_coro_shortcircuits_to_empty(std::vector<test_driver>{
+        {.toggles_    = 0,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 24,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 74, 2, 75, 2, 73, 3, 79, 77, 3, 75, 3, 66, 64, 65}},
+        {.toggles_    = 1,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 25,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 74, 2, 75, 2, 73, 3, 79, 77, 3, 75, 3, 66, 64, 81, 65}},
+        {.toggles_    = 2,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 24,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 74, 2, 75, 2, 73, 3, 79, 77, 3, 75, 3, 66, 64, 65}},
+        {.toggles_    = 3,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 25,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 74, 2, 75, 2, 73, 3, 79, 77, 3, 75, 3, 66, 64, 81, 65}},
+        {.toggles_ = 4, .threw_ = 0, .result_ = {}, .next_event_ = 28, .events_ = {67, 68, 73, 1,  74, 1,  76, 1, 75, 1,
+                                                                                   73, 2,  74, 2,  76, 2,  75, 2, 73, 3,
+                                                                                   79, 77, 3,  75, 3,  66, 64, 65}},
+        {.toggles_    = 5,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 29,
+         .events_     = {67, 68, 73, 1,  74, 1,  76, 1, 75, 1, 73, 2,  74, 2, 76,
+                         2,  75, 2,  73, 3,  79, 77, 3, 75, 3, 66, 64, 81, 65}},
+        {.toggles_ = 6, .threw_ = 0, .result_ = {}, .next_event_ = 28, .events_ = {67, 68, 73, 1,  74, 1,  76, 1, 75, 1,
+                                                                                   73, 2,  74, 2,  76, 2,  75, 2, 73, 3,
+                                                                                   79, 77, 3,  75, 3,  66, 64, 65}},
+        {.toggles_    = 7,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 29,
+         .events_     = {67, 68, 73, 1,  74, 1,  76, 1, 75, 1, 73, 2,  74, 2, 76,
+                         2,  75, 2,  73, 3,  79, 77, 3, 75, 3, 66, 64, 81, 65}},
+        {.toggles_    = 8,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 26,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 74, 2, 75, 2, 73, 3, 79, 77, 3, 78, 3, 75, 3, 66, 64, 65}},
+        {.toggles_    = 9,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 27,
+         .events_ = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 74, 2, 75, 2, 73, 3, 79, 77, 3, 78, 3, 75, 3, 66, 64, 81, 65}},
+        {.toggles_    = 10,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 26,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 74, 2, 75, 2, 73, 3, 79, 77, 3, 78, 3, 75, 3, 66, 64, 65}},
+        {.toggles_    = 11,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 27,
+         .events_ = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 74, 2, 75, 2, 73, 3, 79, 77, 3, 78, 3, 75, 3, 66, 64, 81, 65}},
+        {.toggles_    = 12,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 30,
+         .events_     = {67, 68, 73, 1,  74, 1,  76, 1, 75, 1, 73, 2, 74, 2,  76,
+                         2,  75, 2,  73, 3,  79, 77, 3, 78, 3, 75, 3, 66, 64, 65}},
+        {.toggles_    = 13,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 31,
+         .events_     = {67, 68, 73, 1, 74, 1,  76, 1,  75, 1,  73, 2,  74, 2,  76, 2,
+                         75, 2,  73, 3, 79, 77, 3,  78, 3,  75, 3,  66, 64, 81, 65}},
+        {.toggles_    = 14,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 30,
+         .events_     = {67, 68, 73, 1,  74, 1,  76, 1, 75, 1, 73, 2, 74, 2,  76,
+                         2,  75, 2,  73, 3,  79, 77, 3, 78, 3, 75, 3, 66, 64, 65}},
+        {.toggles_    = 15,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 31,
+         .events_     = {67, 68, 73, 1, 74, 1,  76, 1,  75, 1,  73, 2,  74, 2,  76, 2,
+                         75, 2,  73, 3, 79, 77, 3,  78, 3,  75, 3,  66, 64, 81, 65}},
+        {.toggles_    = 16,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 24,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 74, 2, 75, 2, 73, 3, 79, 77, 3, 75, 3, 66, 64, 65}},
+        {.toggles_    = 17,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 25,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 74, 2, 75, 2, 73, 3, 79, 77, 3, 75, 3, 66, 64, 81, 65}},
+        {.toggles_    = 18,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 24,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 74, 2, 75, 2, 73, 3, 79, 77, 3, 75, 3, 66, 64, 65}},
+        {.toggles_    = 19,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 25,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 74, 2, 75, 2, 73, 3, 79, 77, 3, 75, 3, 66, 64, 81, 65}},
+        {.toggles_    = 20,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 28,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1,  75, 1,  73, 2,  74, 2,
+                         76, 2,  75, 2, 73, 3, 79, 77, 3,  75, 3,  66, 64, 65}},
+        {.toggles_    = 21,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 29,
+         .events_     = {67, 68, 73, 1,  74, 1,  76, 1, 75, 1, 73, 2,  74, 2, 76,
+                         2,  75, 2,  73, 3,  79, 77, 3, 75, 3, 66, 64, 81, 65}},
+        {.toggles_    = 22,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 28,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1,  75, 1,  73, 2,  74, 2,
+                         76, 2,  75, 2, 73, 3, 79, 77, 3,  75, 3,  66, 64, 65}},
+        {.toggles_    = 23,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 29,
+         .events_     = {67, 68, 73, 1,  74, 1,  76, 1, 75, 1, 73, 2,  74, 2, 76,
+                         2,  75, 2,  73, 3,  79, 77, 3, 75, 3, 66, 64, 81, 65}},
+        {.toggles_    = 24,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 26,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 74, 2, 75, 2, 73, 3, 79, 77, 3, 78, 3, 75, 3, 66, 64, 65}},
+        {.toggles_    = 25,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 27,
+         .events_ = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 74, 2, 75, 2, 73, 3, 79, 77, 3, 78, 3, 75, 3, 66, 64, 81, 65}},
+        {.toggles_    = 26,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 26,
+         .events_     = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 74, 2, 75, 2, 73, 3, 79, 77, 3, 78, 3, 75, 3, 66, 64, 65}},
+        {.toggles_    = 27,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 27,
+         .events_ = {67, 68, 73, 1, 74, 1, 75, 1, 73, 2, 74, 2, 75, 2, 73, 3, 79, 77, 3, 78, 3, 75, 3, 66, 64, 81, 65}},
+        {.toggles_    = 28,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 30,
+         .events_     = {67, 68, 73, 1,  74, 1,  76, 1, 75, 1, 73, 2, 74, 2,  76,
+                         2,  75, 2,  73, 3,  79, 77, 3, 78, 3, 75, 3, 66, 64, 65}},
+        {.toggles_    = 29,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 31,
+         .events_     = {67, 68, 73, 1, 74, 1,  76, 1,  75, 1,  73, 2,  74, 2,  76, 2,
+                         75, 2,  73, 3, 79, 77, 3,  78, 3,  75, 3,  66, 64, 81, 65}},
+        {.toggles_    = 30,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 30,
+         .events_     = {67, 68, 73, 1,  74, 1,  76, 1, 75, 1, 73, 2, 74, 2,  76,
+                         2,  75, 2,  73, 3,  79, 77, 3, 78, 3, 75, 3, 66, 64, 65}},
+        {.toggles_    = 31,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 31,
+         .events_     = {67, 68, 73, 1, 74, 1,  76, 1,  75, 1,  73, 2,  74, 2,  76, 2,
+                         75, 2,  73, 3, 79, 77, 3,  78, 3,  75, 3,  66, 64, 81, 65}},
+    }) +
+    test_noneliding_coro_simple_await(std::vector<test_driver>{
+        {.toggles_    = 0,
+         .threw_      = 0,
+         .result_     = 28,
+         .next_event_ = 26,
+         .events_ = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 73, 3, 74, 3, 70, 28, 75, 3, 75, 2, 75, 1, 69, 66, 64, 65}},
+        {.toggles_ = 1, .threw_ = 0, .result_ = 28, .next_event_ = 27, .events_ = {67, 68, 73, 1,  74, 1,  73, 2,  74,
+                                                                                   2,  73, 3,  74, 3,  70, 28, 75, 3,
+                                                                                   75, 2,  75, 1,  69, 66, 64, 81, 65}},
+        {.toggles_ = 2, .threw_ = 0, .result_ = 28, .next_event_ = 27, .events_ = {67, 68, 73, 1,  74, 1,  73, 2,  74,
+                                                                                   2,  73, 3,  74, 3,  70, 28, 71, 75,
+                                                                                   3,  75, 2,  75, 1,  69, 66, 64, 65}},
+        {.toggles_    = 3,
+         .threw_      = 0,
+         .result_     = 28,
+         .next_event_ = 28,
+         .events_     = {67, 68, 73, 1,  74, 1,  73, 2,  74, 2,  73, 3,  74, 3,
+                         70, 28, 71, 75, 3,  75, 2,  75, 1,  69, 66, 64, 81, 65}},
+        {.toggles_    = 4,
+         .threw_      = 0,
+         .result_     = 28,
+         .next_event_ = 32,
+         .events_     = {67, 68, 73, 1, 74, 1,  76, 1, 73, 2, 74, 2, 76, 2,  73, 3,
+                         74, 3,  76, 3, 70, 28, 75, 3, 75, 2, 75, 1, 69, 66, 64, 65}},
+        {.toggles_    = 5,
+         .threw_      = 0,
+         .result_     = 28,
+         .next_event_ = 33,
+         .events_     = {67, 68, 73, 1,  74, 1,  76, 1,  73, 2,  74, 2,  76, 2,  73, 3, 74,
+                         3,  76, 3,  70, 28, 75, 3,  75, 2,  75, 1,  69, 66, 64, 81, 65}},
+        {.toggles_    = 6,
+         .threw_      = 0,
+         .result_     = 28,
+         .next_event_ = 33,
+         .events_     = {67, 68, 73, 1,  74, 1,  76, 1, 73, 2, 74, 2, 76, 2,  73, 3, 74,
+                         3,  76, 3,  70, 28, 71, 75, 3, 75, 2, 75, 1, 69, 66, 64, 65}},
+        {.toggles_    = 7,
+         .threw_      = 0,
+         .result_     = 28,
+         .next_event_ = 34,
+         .events_     = {67, 68, 73, 1,  74, 1,  76, 1, 73, 2, 74, 2, 76, 2,  73, 3,  74,
+                         3,  76, 3,  70, 28, 71, 75, 3, 75, 2, 75, 1, 69, 66, 64, 81, 65}},
+        {.toggles_    = 8,
+         .threw_      = 0,
+         .result_     = 28,
+         .next_event_ = 26,
+         .events_ = {67, 68, 73, 1, 74, 1, 73, 2, 74, 2, 73, 3, 74, 3, 70, 28, 75, 3, 75, 2, 75, 1, 69, 66, 64, 65}},
+        {.toggles_ = 9, .threw_ = 0, .result_ = 28, .next_event_ = 27, .events_ = {67, 68, 73, 1,  74, 1,  73, 2,  74,
+                                                                                   2,  73, 3,  74, 3,  70, 28, 75, 3,
+                                                                                   75, 2,  75, 1,  69, 66, 64, 81, 65}},
+        {.toggles_    = 10,
+         .threw_      = 0,
+         .result_     = 28,
+         .next_event_ = 27,
+         .events_     = {67, 68, 73, 1,  74, 1,  73, 2,  74, 2,  73, 3,  74, 3,
+                         70, 28, 71, 75, 3,  75, 2,  75, 1,  69, 66, 64, 65}},
+        {.toggles_    = 11,
+         .threw_      = 0,
+         .result_     = 28,
+         .next_event_ = 28,
+         .events_     = {67, 68, 73, 1,  74, 1,  73, 2,  74, 2,  73, 3,  74, 3,
+                         70, 28, 71, 75, 3,  75, 2,  75, 1,  69, 66, 64, 81, 65}},
+        {.toggles_    = 12,
+         .threw_      = 0,
+         .result_     = 28,
+         .next_event_ = 32,
+         .events_     = {67, 68, 73, 1, 74, 1,  76, 1, 73, 2, 74, 2, 76, 2,  73, 3,
+                         74, 3,  76, 3, 70, 28, 75, 3, 75, 2, 75, 1, 69, 66, 64, 65}},
+        {.toggles_    = 13,
+         .threw_      = 0,
+         .result_     = 28,
+         .next_event_ = 33,
+         .events_     = {67, 68, 73, 1,  74, 1,  76, 1,  73, 2,  74, 2,  76, 2,  73, 3, 74,
+                         3,  76, 3,  70, 28, 75, 3,  75, 2,  75, 1,  69, 66, 64, 81, 65}},
+        {.toggles_    = 14,
+         .threw_      = 0,
+         .result_     = 28,
+         .next_event_ = 33,
+         .events_     = {67, 68, 73, 1,  74, 1,  76, 1, 73, 2, 74, 2, 76, 2,  73, 3, 74,
+                         3,  76, 3,  70, 28, 71, 75, 3, 75, 2, 75, 1, 69, 66, 64, 65}},
+        {.toggles_    = 15,
+         .threw_      = 0,
+         .result_     = 28,
+         .next_event_ = 34,
+         .events_     = {67, 68, 73, 1,  74, 1,  76, 1, 73, 2, 74, 2, 76, 2,  73, 3,  74,
+                         3,  76, 3,  70, 28, 71, 75, 3, 75, 2, 75, 1, 69, 66, 64, 81, 65}},
+        {.toggles_    = 16,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 18,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 17,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 19,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+        {.toggles_    = 18,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 18,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 19,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 19,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+        {.toggles_    = 20,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 20,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 21,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+        {.toggles_    = 22,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 20,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 23,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 79, 77, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+        {.toggles_    = 24,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 20,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 25,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+        {.toggles_    = 26,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 20,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 27,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 21,
+         .events_     = {67, 68, 73, 1, 74, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+        {.toggles_    = 28,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 22,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 29,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 23,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+        {.toggles_    = 30,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 22,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 66, 64, 65}},
+        {.toggles_    = 31,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 23,
+         .events_     = {67, 68, 73, 1, 74, 1, 76, 1, 73, 2, 79, 77, 2, 78, 2, 75, 2, 75, 1, 66, 64, 81, 65}},
+    }) +
+    test_nested_coroutines(std::vector<test_driver>{
+        {.toggles_    = 0,
+         .threw_      = 0,
+         .result_     = 48,
+         .next_event_ = 60,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 74, 33, 70, 24, 75, 33, 75, 32, 69, 66,
+                         64, 65, 73, 1,  74, 1,  75, 1,  67, 68, 73, 32, 74, 32, 73, 33, 74, 33, 70, 24,
+                         75, 33, 75, 32, 69, 66, 64, 65, 73, 2,  74, 2,  75, 2,  70, 48, 69, 66, 64, 65}},
+        {.toggles_    = 1,
+         .threw_      = 0,
+         .result_     = 48,
+         .next_event_ = 63,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 74, 33, 70, 24, 75, 33, 75, 32, 69, 66, 64,
+                         81, 65, 73, 1,  74, 1,  75, 1,  67, 68, 73, 32, 74, 32, 73, 33, 74, 33, 70, 24, 75,
+                         33, 75, 32, 69, 66, 64, 81, 65, 73, 2,  74, 2,  75, 2,  70, 48, 69, 66, 64, 81, 65}},
+        {.toggles_    = 2,
+         .threw_      = 0,
+         .result_     = 48,
+         .next_event_ = 63,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 74, 33, 70, 24, 71, 75, 33, 75, 32, 69, 66,
+                         64, 65, 73, 1,  74, 1,  75, 1,  67, 68, 73, 32, 74, 32, 73, 33, 74, 33, 70, 24, 71,
+                         75, 33, 75, 32, 69, 66, 64, 65, 73, 2,  74, 2,  75, 2,  70, 48, 71, 69, 66, 64, 65}},
+        {.toggles_    = 3,
+         .threw_      = 0,
+         .result_     = 48,
+         .next_event_ = 66,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 74, 33, 70, 24, 71, 75, 33, 75, 32, 69, 66, 64,
+                         81, 65, 73, 1,  74, 1,  75, 1,  67, 68, 73, 32, 74, 32, 73, 33, 74, 33, 70, 24, 71, 75,
+                         33, 75, 32, 69, 66, 64, 81, 65, 73, 2,  74, 2,  75, 2,  70, 48, 71, 69, 66, 64, 81, 65}},
+        {.toggles_    = 4,
+         .threw_      = 0,
+         .result_     = 48,
+         .next_event_ = 72,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 73, 33, 74, 33, 76, 33, 70, 24, 75, 33, 75, 32, 69, 66,
+                         64, 65, 73, 1,  74, 1,  76, 1,  75, 1,  67, 68, 73, 32, 74, 32, 76, 32, 73, 33, 74, 33, 76, 33,
+                         70, 24, 75, 33, 75, 32, 69, 66, 64, 65, 73, 2,  74, 2,  76, 2,  75, 2,  70, 48, 69, 66, 64, 65}},
+        {.toggles_    = 5,
+         .threw_      = 0,
+         .result_     = 48,
+         .next_event_ = 75,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 73, 33, 74, 33, 76, 33, 70, 24, 75,
+                         33, 75, 32, 69, 66, 64, 81, 65, 73, 1,  74, 1,  76, 1,  75, 1,  67, 68, 73,
+                         32, 74, 32, 76, 32, 73, 33, 74, 33, 76, 33, 70, 24, 75, 33, 75, 32, 69, 66,
+                         64, 81, 65, 73, 2,  74, 2,  76, 2,  75, 2,  70, 48, 69, 66, 64, 81, 65}},
+        {.toggles_    = 6,
+         .threw_      = 0,
+         .result_     = 48,
+         .next_event_ = 75,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 73, 33, 74, 33, 76, 33, 70, 24, 71,
+                         75, 33, 75, 32, 69, 66, 64, 65, 73, 1,  74, 1,  76, 1,  75, 1,  67, 68, 73,
+                         32, 74, 32, 76, 32, 73, 33, 74, 33, 76, 33, 70, 24, 71, 75, 33, 75, 32, 69,
+                         66, 64, 65, 73, 2,  74, 2,  76, 2,  75, 2,  70, 48, 71, 69, 66, 64, 65}},
+        {.toggles_    = 7,
+         .threw_      = 0,
+         .result_     = 48,
+         .next_event_ = 78,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 73, 33, 74, 33, 76, 33, 70, 24, 71, 75,
+                         33, 75, 32, 69, 66, 64, 81, 65, 73, 1,  74, 1,  76, 1,  75, 1,  67, 68, 73, 32,
+                         74, 32, 76, 32, 73, 33, 74, 33, 76, 33, 70, 24, 71, 75, 33, 75, 32, 69, 66, 64,
+                         81, 65, 73, 2,  74, 2,  76, 2,  75, 2,  70, 48, 71, 69, 66, 64, 81, 65}},
+        {.toggles_    = 8,
+         .threw_      = 0,
+         .result_     = 48,
+         .next_event_ = 60,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 74, 33, 70, 24, 75, 33, 75, 32, 69, 66,
+                         64, 65, 73, 1,  74, 1,  75, 1,  67, 68, 73, 32, 74, 32, 73, 33, 74, 33, 70, 24,
+                         75, 33, 75, 32, 69, 66, 64, 65, 73, 2,  74, 2,  75, 2,  70, 48, 69, 66, 64, 65}},
+        {.toggles_    = 9,
+         .threw_      = 0,
+         .result_     = 48,
+         .next_event_ = 63,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 74, 33, 70, 24, 75, 33, 75, 32, 69, 66, 64,
+                         81, 65, 73, 1,  74, 1,  75, 1,  67, 68, 73, 32, 74, 32, 73, 33, 74, 33, 70, 24, 75,
+                         33, 75, 32, 69, 66, 64, 81, 65, 73, 2,  74, 2,  75, 2,  70, 48, 69, 66, 64, 81, 65}},
+        {.toggles_    = 10,
+         .threw_      = 0,
+         .result_     = 48,
+         .next_event_ = 63,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 74, 33, 70, 24, 71, 75, 33, 75, 32, 69, 66,
+                         64, 65, 73, 1,  74, 1,  75, 1,  67, 68, 73, 32, 74, 32, 73, 33, 74, 33, 70, 24, 71,
+                         75, 33, 75, 32, 69, 66, 64, 65, 73, 2,  74, 2,  75, 2,  70, 48, 71, 69, 66, 64, 65}},
+        {.toggles_    = 11,
+         .threw_      = 0,
+         .result_     = 48,
+         .next_event_ = 66,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 74, 33, 70, 24, 71, 75, 33, 75, 32, 69, 66, 64,
+                         81, 65, 73, 1,  74, 1,  75, 1,  67, 68, 73, 32, 74, 32, 73, 33, 74, 33, 70, 24, 71, 75,
+                         33, 75, 32, 69, 66, 64, 81, 65, 73, 2,  74, 2,  75, 2,  70, 48, 71, 69, 66, 64, 81, 65}},
+        {.toggles_    = 12,
+         .threw_      = 0,
+         .result_     = 48,
+         .next_event_ = 72,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 73, 33, 74, 33, 76, 33, 70, 24, 75, 33, 75, 32, 69, 66,
+                         64, 65, 73, 1,  74, 1,  76, 1,  75, 1,  67, 68, 73, 32, 74, 32, 76, 32, 73, 33, 74, 33, 76, 33,
+                         70, 24, 75, 33, 75, 32, 69, 66, 64, 65, 73, 2,  74, 2,  76, 2,  75, 2,  70, 48, 69, 66, 64, 65}},
+        {.toggles_    = 13,
+         .threw_      = 0,
+         .result_     = 48,
+         .next_event_ = 75,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 73, 33, 74, 33, 76, 33, 70, 24, 75,
+                         33, 75, 32, 69, 66, 64, 81, 65, 73, 1,  74, 1,  76, 1,  75, 1,  67, 68, 73,
+                         32, 74, 32, 76, 32, 73, 33, 74, 33, 76, 33, 70, 24, 75, 33, 75, 32, 69, 66,
+                         64, 81, 65, 73, 2,  74, 2,  76, 2,  75, 2,  70, 48, 69, 66, 64, 81, 65}},
+        {.toggles_    = 14,
+         .threw_      = 0,
+         .result_     = 48,
+         .next_event_ = 75,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 73, 33, 74, 33, 76, 33, 70, 24, 71,
+                         75, 33, 75, 32, 69, 66, 64, 65, 73, 1,  74, 1,  76, 1,  75, 1,  67, 68, 73,
+                         32, 74, 32, 76, 32, 73, 33, 74, 33, 76, 33, 70, 24, 71, 75, 33, 75, 32, 69,
+                         66, 64, 65, 73, 2,  74, 2,  76, 2,  75, 2,  70, 48, 71, 69, 66, 64, 65}},
+        {.toggles_    = 15,
+         .threw_      = 0,
+         .result_     = 48,
+         .next_event_ = 78,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 73, 33, 74, 33, 76, 33, 70, 24, 71, 75,
+                         33, 75, 32, 69, 66, 64, 81, 65, 73, 1,  74, 1,  76, 1,  75, 1,  67, 68, 73, 32,
+                         74, 32, 76, 32, 73, 33, 74, 33, 76, 33, 70, 24, 71, 75, 33, 75, 32, 69, 66, 64,
+                         81, 65, 73, 2,  74, 2,  76, 2,  75, 2,  70, 48, 71, 69, 66, 64, 81, 65}},
+        {.toggles_    = 16,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 30,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 79, 77, 33, 75, 33,
+                         75, 32, 66, 64, 65, 73, 1,  79, 77, 1,  75, 1,  66, 64, 65}},
+        {.toggles_    = 17,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 32,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 79, 77, 33, 75, 33, 75,
+                         32, 66, 64, 81, 65, 73, 1,  79, 77, 1,  75, 1,  66, 64, 81, 65}},
+        {.toggles_    = 18,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 30,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 79, 77, 33, 75, 33,
+                         75, 32, 66, 64, 65, 73, 1,  79, 77, 1,  75, 1,  66, 64, 65}},
+        {.toggles_    = 19,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 32,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 79, 77, 33, 75, 33, 75,
+                         32, 66, 64, 81, 65, 73, 1,  79, 77, 1,  75, 1,  66, 64, 81, 65}},
+        {.toggles_    = 20,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 32,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 73, 33, 79, 77, 33, 75,
+                         33, 75, 32, 66, 64, 65, 73, 1,  79, 77, 1,  75, 1,  66, 64, 65}},
+        {.toggles_    = 21,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 34,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 73, 33, 79, 77, 33, 75, 33,
+                         75, 32, 66, 64, 81, 65, 73, 1,  79, 77, 1,  75, 1,  66, 64, 81, 65}},
+        {.toggles_    = 22,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 32,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 73, 33, 79, 77, 33, 75,
+                         33, 75, 32, 66, 64, 65, 73, 1,  79, 77, 1,  75, 1,  66, 64, 65}},
+        {.toggles_    = 23,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 34,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 73, 33, 79, 77, 33, 75, 33,
+                         75, 32, 66, 64, 81, 65, 73, 1,  79, 77, 1,  75, 1,  66, 64, 81, 65}},
+        {.toggles_    = 24,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 34,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 79, 77, 33, 78, 33, 75, 33,
+                         75, 32, 66, 64, 65, 73, 1,  79, 77, 1,  78, 1,  75, 1,  66, 64, 65}},
+        {.toggles_    = 25,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 36,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 79, 77, 33, 78, 33, 75, 33, 75,
+                         32, 66, 64, 81, 65, 73, 1,  79, 77, 1,  78, 1,  75, 1,  66, 64, 81, 65}},
+        {.toggles_    = 26,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 34,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 79, 77, 33, 78, 33, 75, 33,
+                         75, 32, 66, 64, 65, 73, 1,  79, 77, 1,  78, 1,  75, 1,  66, 64, 65}},
+        {.toggles_    = 27,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 36,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 73, 33, 79, 77, 33, 78, 33, 75, 33, 75,
+                         32, 66, 64, 81, 65, 73, 1,  79, 77, 1,  78, 1,  75, 1,  66, 64, 81, 65}},
+        {.toggles_    = 28,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 36,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 73, 33, 79, 77, 33, 78, 33, 75,
+                         33, 75, 32, 66, 64, 65, 73, 1,  79, 77, 1,  78, 1,  75, 1,  66, 64, 65}},
+        {.toggles_    = 29,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 38,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 73, 33, 79, 77, 33, 78, 33, 75, 33,
+                         75, 32, 66, 64, 81, 65, 73, 1,  79, 77, 1,  78, 1,  75, 1,  66, 64, 81, 65}},
+        {.toggles_    = 30,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 36,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 73, 33, 79, 77, 33, 78, 33, 75,
+                         33, 75, 32, 66, 64, 65, 73, 1,  79, 77, 1,  78, 1,  75, 1,  66, 64, 65}},
+        {.toggles_    = 31,
+         .threw_      = 0,
+         .result_     = {},
+         .next_event_ = 38,
+         .events_     = {67, 68, 67, 68, 73, 32, 74, 32, 76, 32, 73, 33, 79, 77, 33, 78, 33, 75, 33,
+                         75, 32, 66, 64, 81, 65, 73, 1,  79, 77, 1,  78, 1,  75, 1,  66, 64, 81, 65}},
+    })
diff --git a/libcxx/test/std/language.support/support.coroutines/end.to.end/coro_await_suspend_destroy.pass.cpp b/libcxx/test/std/language.support/support.coroutines/end.to.end/coro_await_suspend_destroy.pass.cpp
new file mode 100644
index 0000000000000..fcad52d2e8be6
--- /dev/null
+++ b/libcxx/test/std/language.support/support.coroutines/end.to.end/coro_await_suspend_destroy.pass.cpp
@@ -0,0 +1,560 @@
+//===-- Integration test for `clang::co_await_suspend_destroy` ------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+// This file tests the `[[clang::coro_await_suspend_destroy]]` attribute and the
+// `await_suspend_destroy()` method. It is ALSO a change detector for any
+// deviations from the pre-recorded standard `await_suspend()` control flow.
+//
+// How to diagnose a failure:
+//   - First, rerun a failure with `DEBUG_LOG 1`.
+//   - If you see a mismatch between "gold" and "no attr" outputs, this likely
+//     means that a coroutine control flow bug was introduced (or, far less
+//     likely, fixed).
+//   - On the other hand, mismatches between "gold" and "attr" prove that a bug
+//     was introduced in the `[[clang::coro_await_suspend_destroy]]`
+//     implementation.
+//
+// Per `AttrDocs.td`, using `[[clang::coro_await_suspend_destroy]]` with
+// `await_suspend_destroy()` should be equivalent to providing a stub
+// `await_suspend()` that calls `await_suspend_destroy()` and immediately
+// destroys the coroutine handle.
+//
+// This test logs control flow in a variety of scenarios (controlled by
+// `test_toggles`), and checks that the execution traces are identical for
+// awaiters with/without the attribute. We currently test all combinations of
+// error injection points to ensure behavioral equivalence.
+//
+// In contrast to Clang `lit` tests, this makes it easy to verify non-divergence
+// of functional behavior of the entire coroutine across many scenarios,
+// including exception handling, early returns, and mixed usage with legacy
+// awaitables.
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+
+#if __has_cpp_attribute(clang::coro_await_suspend_destroy)
+#  define ATTR_CORO_AWAIT_SUSPEND_DESTROY [[clang::coro_await_suspend_destroy]]
+#else
+#  define ATTR_CORO_AWAIT_SUSPEND_DESTROY
+#endif
+
+#include <cassert>
+#include <concepts>
+#include <coroutine>
+#include <exception>
+#include <iostream>
+#include <memory>
+#include <optional>
+#include <string>
+#include <vector>
+
+#include "test_macros.h" // only for `TEST_HAS_NO_EXCEPTIONS`
+
+// Using `std::cerr` breaks no-localization CI, set to 1 if needed.
+#define DEBUG_LOG 0
+
+// If you've deliberately changed the test's order of events, you have to
+// re-bootstrap two sets of golden data.
+//
+// First, make sure `TEST_HAS_NO_EXCEPTIONS` is NOT defined, and:
+//   - Temporarily set `BOOTSTRAP_GOLDEN_TEST_OUTPUT` to 1.
+//   - Run this binary, redirecting stdout into
+//     `coro_await_suspend_destroy.golden-exceptions.h`.
+//   - Run clang-format.
+//
+// Second, temporarily `#define TEST_HAS_NO_EXCEPTIONS 1`, and repeat, saving
+// the output to `coro_await_suspend_destroy.golden-no-exceptions.h`.
+//
+// Finally, undo both of the `#define` changes.
+#define BOOTSTRAP_GOLDEN_TEST_OUTPUT 0
+
+#ifndef TEST_HAS_NO_EXCEPTIONS
+#  define THROW_IF_EXCEPTIONS_ENABLED(_ex) throw _ex;
+#else
+#  define THROW_IF_EXCEPTIONS_ENABLED(_ex)
+#endif
+
+struct my_err : std::exception {};
+
+enum class test_toggles {
+  throw_in_convert_optional_wrapper = 0x01,
+  throw_in_return_value             = 0x02,
+  throw_in_await_resume             = 0x04,
+  throw_in_await_suspend_destroy    = 0x08,
+  dynamic_short_circuit             = 0x10,                 // Does not apply to `..._shortcircuits_to_empty` tests
+  largest                           = dynamic_short_circuit // for array in `test_driver`
+};
+
+enum class test_event {
+  unset = 0,
+  // Besides events, we also log various integers between 1 and 63 that
+  // disambiguate different awaiters, or represent different return values.
+  smallest                 = 64,
+  convert_optional_wrapper = smallest,
+  destroy_return_object,
+  destroy_promise,
+  get_return_object,
+  initial_suspend,
+  final_suspend,
+  return_value,
+  throw_return_value,
+  unhandled_exception,
+  await_ready,
+  await_resume,
+  destroy_optional_awaitable,
+  throw_await_resume,
+  await_suspend_destroy,
+  throw_await_suspend_destroy,
+  await_suspend,
+  coro_catch,
+  throw_convert_optional_wrapper,
+  largest = throw_convert_optional_wrapper
+};
+
+struct test_driver {
+  static constexpr int max_events = 1000;
+
+  int toggles_ = -1;
+  bool threw_  = false;
+  // -1 is distinct from all events & values, and the empty state.
+  // It will show up only on the "with exceptions" & "threw" paths.
+  std::optional<int> result_{-1};
+  int next_event_         = 0;
+  int events_[max_events] = {};
+
+  void assert_equivalent(const test_driver& other) {
+    assert(toggles_ == other.toggles_);
+    assert(threw_ == other.threw_);
+    assert(result_ == other.result_);
+    assert(next_event_ == other.next_event_);
+    for (int i = 0; i < next_event_; ++i) {
+      assert(events_[i] == other.events_[i]);
+    }
+  }
+
+  static test_driver from_toggle_mask(int toggles) {
+    assert(toggles >= 0);
+    assert(toggles < ((int)test_toggles::largest << 1));
+    return test_driver{.toggles_ = toggles};
+  }
+
+  bool toggles(test_toggles toggle) const {
+    assert(toggles_ != -1);
+    return ((int)toggles_ & (int)toggle) != 0;
+  }
+
+  void log(auto&&... events) {
+    (
+        [this](auto&& event) {
+          auto int_event = static_cast<int>(event);
+          // Make sure "values" and "events" don't overlap -- this makes it safe
+          // to make the event codes shorter.
+          if constexpr (std::same_as< test_event, std::remove_reference_t<decltype(event)>>) {
+            assert(int_event >= (int)test_event::smallest);
+            assert(int_event <= (int)test_event::largest);
+          } else {
+            assert(int_event > 0);
+            assert(int_event < (int)test_event::smallest);
+          }
+          assert(next_event_ < max_events);
+          events_[next_event_++] = int_event;
+        }(events),
+        ...);
+  }
+
+  std::string repr() const {
+    std::string result =
+        "{\n    .toggles_ = " + std::to_string(toggles_) + //
+        ",\n    .threw_ = " + std::to_string(threw_) +     //
+        ",\n    .result_ = " + (result_.has_value() ? std::to_string(*result_) : "{}") +
+        ",\n    .next_event_ = " + std::to_string(next_event_) + //
+        ",\n    .events_ = {";
+    for (int i = 0; i < next_event_; ++i) {
+      result += std::to_string(events_[i]);
+      result += (i < next_event_ - 1) ? ", " : "}";
+    }
+    result += "}";
+    return result;
+  }
+};
+
+// We test `optional<int>` and `optional<heap_int>`. Record just the value.
+std::optional<int> intify_optional(auto&& opt) {
+  if (opt.has_value()) {
+    return std::optional<int>{static_cast<int>(opt.value())};
+  }
+  return {};
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// The coroutine & awaitables under test
+////////////////////////////////////////////////////////////////////////////////
+
+// `optional_wrapper` exists since `get_return_object()` can't return
+// `std::optional` directly. C++ coroutines have a fundamental timing mismatch
+// between when the return object is created and when the value is available:
+//
+// 1) Early (coroutine startup): `get_return_object()` is called and must return
+//    something immediately.
+// 2) Later (when `co_return` executes): `return_value(T)` is called with the
+//    actual value.
+// 3) Issue: If `get_return_object()` returns the storage, it's empty when
+//    returned, and writing to it later cannot affect the already-returned copy.
+template <typename T>
+struct optional_wrapper {
+  test_driver& driver_;
+  std::optional<T> storage_;
+  std::optional<T>*& pointer_;
+  optional_wrapper(test_driver& driver, std::optional<T>*& p) : driver_(driver), pointer_(p) { pointer_ = &storage_; }
+  operator std::optional<T>() {
+    driver_.log(test_event::convert_optional_wrapper);
+    if (driver_.toggles(test_toggles::throw_in_convert_optional_wrapper)) {
+      driver_.log(test_event::throw_convert_optional_wrapper);
+      THROW_IF_EXCEPTIONS_ENABLED(my_err());
+    }
+    return std::move(storage_);
+  }
+  ~optional_wrapper() { driver_.log(test_event::destroy_return_object); }
+};
+
+// Make `std::optional` a coroutine
+template <typename T, typename... Args>
+struct std::coroutine_traits<std::optional<T>, test_driver&, Args...> {
+  struct promise_type {
+    std::optional<T>* storagePtr_ = nullptr;
+    test_driver& driver_;
+
+    promise_type(test_driver& driver, auto&&...) : driver_(driver) {}
+    ~promise_type() { driver_.log(test_event::destroy_promise); }
+    optional_wrapper<T> get_return_object() {
+      driver_.log(test_event::get_return_object);
+      return optional_wrapper<T>(driver_, storagePtr_);
+    }
+    std::suspend_never initial_suspend() const noexcept {
+      driver_.log(test_event::initial_suspend);
+      return {};
+    }
+    std::suspend_never final_suspend() const noexcept {
+      driver_.log(test_event::final_suspend);
+      return {};
+    }
+    void return_value(T value) {
+      driver_.log(test_event::return_value, value);
+      if (driver_.toggles(test_toggles::throw_in_return_value)) {
+        driver_.log(test_event::throw_return_value);
+        THROW_IF_EXCEPTIONS_ENABLED(my_err());
+      }
+      *storagePtr_ = std::move(value);
+    }
+    void unhandled_exception() {
+      // Leave `*storagePtr_` empty to represent error
+      driver_.log(test_event::unhandled_exception);
+    }
+  };
+};
+
+template <typename T, bool HasAttr>
+struct base_optional_awaitable {
+  test_driver& driver_;
+  int id_;
+  std::optional<T> opt_;
+
+  ~base_optional_awaitable() { driver_.log(test_event::destroy_optional_awaitable, id_); }
+
+  bool await_ready() const noexcept {
+    driver_.log(test_event::await_ready, id_);
+    return opt_.has_value();
+  }
+  T await_resume() {
+    driver_.log(test_event::await_resume, id_);
+    if (driver_.toggles(test_toggles::throw_in_await_resume)) {
+      driver_.log(test_event::throw_await_resume, id_);
+      THROW_IF_EXCEPTIONS_ENABLED(my_err());
+    }
+    return std::move(opt_).value();
+  }
+  void await_suspend_destroy(auto& promise) {
+#if __has_cpp_attribute(clang::coro_await_suspend_destroy)
+    // This makes events compare equal, with and without the attribute. However,
+    // if the attribute is broken and `await_suspend()` is the entry point, then
+    // `test_event::await_suspend` will get appended TWICE, catching the bug.
+    if constexpr (HasAttr) {
+      driver_.log(test_event::await_suspend);
+    }
+#endif
+    assert(promise.storagePtr_);
+    driver_.log(test_event::await_suspend_destroy, id_);
+    if (driver_.toggles(test_toggles::throw_in_await_suspend_destroy)) {
+      driver_.log(test_event::throw_await_suspend_destroy, id_);
+      THROW_IF_EXCEPTIONS_ENABLED(my_err());
+    }
+  }
+  void await_suspend(auto handle) {
+    driver_.log(test_event::await_suspend);
+    await_suspend_destroy(handle.promise());
+    handle.destroy();
+  }
+};
+
+template <typename T>
+struct old_optional_awaitable : base_optional_awaitable<T, false> {};
+
+template <typename T>
+struct ATTR_CORO_AWAIT_SUSPEND_DESTROY new_optional_awaitable : base_optional_awaitable<T, true> {};
+
+////////////////////////////////////////////////////////////////////////////////
+// Machinery for driving the test coros & comparing their results
+////////////////////////////////////////////////////////////////////////////////
+
+// Generate all combinations of toggle values, with empty event traces
+std::vector<test_driver> bootstrap_drivers() {
+  std::vector<test_driver> drivers;
+  for (int mask = 0; mask < ((int)test_toggles::largest << 1); ++mask) {
+    drivers.emplace_back(test_driver::from_toggle_mask(mask));
+  }
+  return drivers;
+}
+
+template <typename T, bool PrintsGold = false>
+void check_coro_with_driver_for([[maybe_unused]] const char* test_name, auto& expected_drivers, auto coro_fn) {
+  for (auto expected_driver : expected_drivers) {
+    auto old_driver = test_driver::from_toggle_mask(expected_driver.toggles_);
+#ifndef TEST_HAS_NO_EXCEPTIONS
+    try {
+#endif
+      old_driver.result_ = intify_optional(coro_fn.template operator()<old_optional_awaitable<T>, T>(old_driver));
+#ifndef TEST_HAS_NO_EXCEPTIONS
+    } catch (const my_err&) {
+      old_driver.threw_ = true;
+    }
+#endif
+
+    auto new_driver = test_driver::from_toggle_mask(expected_driver.toggles_);
+#ifndef TEST_HAS_NO_EXCEPTIONS
+    try {
+#endif
+      new_driver.result_ = intify_optional(coro_fn.template operator()<new_optional_awaitable<T>, T>(new_driver));
+#ifndef TEST_HAS_NO_EXCEPTIONS
+    } catch (const my_err&) {
+      new_driver.threw_ = true;
+    }
+#endif
+
+#if BOOTSTRAP_GOLDEN_TEST_OUTPUT
+    if constexpr (PrintsGold) {
+      std::cout << old_driver.repr() << "," << std::endl;
+    }
+#endif
+#if DEBUG_LOG
+    // NB: This omits "has exceptions" and `T`. See "support/type_id.h".
+    std::cerr << test_name << " (no attr) = " << old_driver.repr() << std::endl;
+    std::cerr << test_name << " (with attr) = " << new_driver.repr() << std::endl;
+    std::cerr << "gold = " << expected_driver.repr() << std::endl << std::endl;
+#endif
+
+#if !BOOTSTRAP_GOLDEN_TEST_OUTPUT
+    // Outside of boostrap, first check normal control flow against the gold
+    old_driver.assert_equivalent(expected_driver);
+#endif
+    // Always check that the attribute matches normal control flow.
+    old_driver.assert_equivalent(new_driver);
+  };
+}
+
+// Move-only, non-nullable type that quacks like int but stores a
+// heap-allocated int. Used to exercise the machinery with a nontrivial type.
+class heap_int {
+private:
+  std::unique_ptr<int> ptr_;
+
+public:
+  explicit heap_int(int value) : ptr_(std::make_unique<int>(value)) {}
+
+  heap_int operator+(const heap_int& other) const { return heap_int(*ptr_ + *other.ptr_); }
+
+  bool operator==(const heap_int& other) const { return *ptr_ == *other.ptr_; }
+
+  /*implicit*/ operator int() const { return *ptr_; }
+};
+
+int check_coro_with_driver(const char* test_name, const auto& expected, auto coro_fn) {
+#if BOOTSTRAP_GOLDEN_TEST_OUTPUT
+  std::cout << "+" << test_name << "(std::vector<test_driver>{" << std::endl;
+#endif
+  check_coro_with_driver_for<int, true>(test_name, expected, coro_fn);
+#if BOOTSTRAP_GOLDEN_TEST_OUTPUT
+  std::cout << "})" << std::endl;
+#endif
+  // The event trace should be the same for `int` and `heap_int`.
+  check_coro_with_driver_for<heap_int>(test_name, expected, coro_fn);
+  return 1; // main counts tests
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Run these 7 tests with different toggles against a header with golden outputs
+////////////////////////////////////////////////////////////////////////////////
+
+template <typename Awaitable, typename T>
+std::optional<T> coro_shortcircuits_to_empty(test_driver& driver) {
+  T n = co_await Awaitable{driver, 1, std::optional<T>{4}};
+  co_await Awaitable{driver, 2, std::optional<T>{}}; // return early!
+  co_return n + co_await Awaitable{driver, 3, std::optional<T>{8}};
+}
+
+int test_coro_shortcircuits_to_empty(const auto& expected) {
+  return check_coro_with_driver(
+      "test_coro_shortcircuits_to_empty", expected, []<typename Awaitable, typename T>(test_driver& driver) {
+        return coro_shortcircuits_to_empty<Awaitable, T>(driver);
+      });
+}
+
+template <typename Awaitable, typename T>
+std::optional<T> coro_simple_await(test_driver& driver) {
+  co_return co_await Awaitable{driver, 1, std::optional<T>{4}} +
+      co_await Awaitable{
+          driver, 2, driver.toggles(test_toggles::dynamic_short_circuit) ? std::optional<T>{} : std::optional<T>{8}};
+}
+
+int test_coro_simple_await(const auto& expected) {
+  return check_coro_with_driver(
+      "test_coro_simple_await", expected, []<typename Awaitable, typename T>(test_driver& driver) {
+        return coro_simple_await<Awaitable, T>(driver);
+      });
+}
+
+// The next pair of tests checks that adding a `try-catch` in the coroutine
+// doesn't affect control flow when `await_suspend_destroy` awaiters are in use.
+
+template <typename Awaitable, typename T>
+std::optional<T> coro_catching_shortcircuits_to_empty(test_driver& driver) {
+#ifndef TEST_HAS_NO_EXCEPTIONS
+  try {
+#endif
+    T n = co_await Awaitable{driver, 1, std::optional<T>{4}};
+    co_await Awaitable{driver, 2, std::optional<T>{}}; // return early!
+    co_return n + co_await Awaitable{driver, 3, std::optional<T>{8}};
+#ifndef TEST_HAS_NO_EXCEPTIONS
+  } catch (...) {
+    driver.log(test_event::coro_catch);
+    throw;
+  }
+#endif
+}
+
+int test_coro_catching_shortcircuits_to_empty(const auto& expected) {
+  return check_coro_with_driver(
+      "test_coro_catching_shortcircuits_to_empty", expected, []<typename Awaitable, typename T>(test_driver& driver) {
+        return coro_catching_shortcircuits_to_empty<Awaitable, T>(driver);
+      });
+}
+
+template <typename Awaitable, typename T>
+std::optional<T> coro_catching_simple_await(test_driver& driver) {
+#ifndef TEST_HAS_NO_EXCEPTIONS
+  try {
+#endif
+    co_return co_await Awaitable{driver, 1, std::optional<T>{4}} +
+        co_await Awaitable{
+            driver, 2, driver.toggles(test_toggles::dynamic_short_circuit) ? std::optional<T>{} : std::optional<T>{8}};
+#ifndef TEST_HAS_NO_EXCEPTIONS
+  } catch (...) {
+    driver.log(test_event::coro_catch);
+    throw;
+  }
+#endif
+}
+
+int test_coro_catching_simple_await(const auto& expected) {
+  return check_coro_with_driver(
+      "test_coro_catching_simple_await", expected, []<typename Awaitable, typename T>(test_driver& driver) {
+        return coro_catching_simple_await<Awaitable, T>(driver);
+      });
+}
+
+// The next pair of tests shows that the `await_suspend_destroy` code path works
+// correctly, even if it's mixed in a coroutine with legacy awaitables.
+
+template <typename Awaitable, typename T>
+std::optional<T> noneliding_coro_shortcircuits_to_empty(test_driver& driver) {
+  T n  = co_await Awaitable{driver, 1, std::optional<T>{8}};
+  T n2 = co_await old_optional_awaitable<T>{driver, 2, std::optional<T>{16}};
+  co_await Awaitable{driver, 3, std::optional<T>{}}; // return early!
+  co_return n + n2 + co_await Awaitable{driver, 4, std::optional<T>{32}};
+}
+
+int test_noneliding_coro_shortcircuits_to_empty(const auto& expected) {
+  return check_coro_with_driver(
+      "test_noneliding_coro_shortcircuits_to_empty", expected, []<typename Awaitable, typename T>(test_driver& driver) {
+        return noneliding_coro_shortcircuits_to_empty<Awaitable, T>(driver);
+      });
+}
+
+template <typename Awaitable, typename T>
+std::optional<T> noneliding_coro_simple_await(test_driver& driver) {
+  co_return co_await Awaitable{driver, 1, std::optional<T>{4}} +
+      co_await Awaitable{
+          driver, 2, driver.toggles(test_toggles::dynamic_short_circuit) ? std::optional<T>{} : std::optional<T>{8}} +
+      co_await old_optional_awaitable<T>{driver, 3, std::optional<T>{16}};
+}
+
+int test_noneliding_coro_simple_await(const auto& expected) {
+  return check_coro_with_driver(
+      "test_noneliding_coro_simple_await", expected, []<typename Awaitable, typename T>(test_driver& driver) {
+        return noneliding_coro_simple_await<Awaitable, T>(driver);
+      });
+}
+
+// Test nested coroutines (coroutines that await other coroutines)
+
+template <typename Awaitable, typename T>
+std::optional<T> inner_coro(test_driver& driver, int base_id) {
+  co_return co_await Awaitable{driver, base_id, std::optional<T>{8}} +
+      co_await Awaitable{
+          driver,
+          base_id + 1,
+          driver.toggles(test_toggles::dynamic_short_circuit) ? std::optional<T>{} : std::optional<T>{16}};
+}
+
+template <typename Awaitable, typename T>
+std::optional<T> outer_coro(test_driver& driver) {
+  T result1 = co_await Awaitable{driver, 1, inner_coro<Awaitable, T>(driver, 32)};
+  T result2 = co_await Awaitable{driver, 2, inner_coro<Awaitable, T>(driver, 32)};
+  co_return result1 + result2;
+}
+
+int test_nested_coroutines(const auto& expected) {
+  return check_coro_with_driver(
+      "test_nested_coroutines", expected, []<typename Awaitable, typename T>(test_driver& driver) {
+        return outer_coro<Awaitable, T>(driver);
+      });
+}
+
+int main(int, char**) {
+#if BOOTSTRAP_GOLDEN_TEST_OUTPUT
+  // This top-of-file comment aims to reduce confusion when bootstrapping.
+#  ifdef TEST_HAS_NO_EXCEPTIONS
+  std::cout << "// coro_await_suspend_destroy.golden-no-exceptions.h" << std::endl;
+#  else
+  std::cout << "// coro_await_suspend_destroy.golden-exceptions.h" << std::endl;
+#  endif
+#endif
+  // Consistency check: return 0 if the #include has 7 tests.
+  return 7 !=
+         (
+#if BOOTSTRAP_GOLDEN_TEST_OUTPUT
+             test_coro_shortcircuits_to_empty(bootstrap_drivers()) + test_coro_simple_await(bootstrap_drivers()) +
+             test_coro_catching_shortcircuits_to_empty(bootstrap_drivers()) +
+             test_coro_catching_simple_await(bootstrap_drivers()) +
+             test_noneliding_coro_shortcircuits_to_empty(bootstrap_drivers()) +
+             test_noneliding_coro_simple_await(bootstrap_drivers()) + test_nested_coroutines(bootstrap_drivers())
+#elif defined(TEST_HAS_NO_EXCEPTIONS)
+#  include "coro_await_suspend_destroy.golden-no-exceptions.h"
+#else
+#  include "coro_await_suspend_destroy.golden-exceptions.h"
+#endif
+         );
+}



More information about the libcxx-commits mailing list