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{ + {.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{ + {.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{ + {.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{ + {.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{ + {.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{ + {.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{ + {.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{ + {.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{ + {.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{ + {.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{ + {.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{ + {.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{ + {.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{ + {.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 +#include +#include +#include +#include +#include +#include +#include +#include + +#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 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(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>) { + 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` and `optional`. Record just the value. +std::optional intify_optional(auto&& opt) { + if (opt.has_value()) { + return std::optional{static_cast(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 +struct optional_wrapper { + test_driver& driver_; + std::optional storage_; + std::optional*& pointer_; + optional_wrapper(test_driver& driver, std::optional*& p) : driver_(driver), pointer_(p) { pointer_ = &storage_; } + operator std::optional() { + 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 +struct std::coroutine_traits, test_driver&, Args...> { + struct promise_type { + std::optional* storagePtr_ = nullptr; + test_driver& driver_; + + promise_type(test_driver& driver, auto&&...) : driver_(driver) {} + ~promise_type() { driver_.log(test_event::destroy_promise); } + optional_wrapper get_return_object() { + driver_.log(test_event::get_return_object); + return optional_wrapper(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 +struct base_optional_awaitable { + test_driver& driver_; + int id_; + std::optional 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 +struct old_optional_awaitable : base_optional_awaitable {}; + +template +struct ATTR_CORO_AWAIT_SUSPEND_DESTROY new_optional_awaitable : base_optional_awaitable {}; + +//////////////////////////////////////////////////////////////////////////////// +// Machinery for driving the test coros & comparing their results +//////////////////////////////////////////////////////////////////////////////// + +// Generate all combinations of toggle values, with empty event traces +std::vector bootstrap_drivers() { + std::vector drivers; + for (int mask = 0; mask < ((int)test_toggles::largest << 1); ++mask) { + drivers.emplace_back(test_driver::from_toggle_mask(mask)); + } + return drivers; +} + +template +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(), 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(), 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 ptr_; + +public: + explicit heap_int(int value) : ptr_(std::make_unique(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{" << std::endl; +#endif + check_coro_with_driver_for(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(test_name, expected, coro_fn); + return 1; // main counts tests +} + +//////////////////////////////////////////////////////////////////////////////// +// Run these 7 tests with different toggles against a header with golden outputs +//////////////////////////////////////////////////////////////////////////////// + +template +std::optional coro_shortcircuits_to_empty(test_driver& driver) { + T n = co_await Awaitable{driver, 1, std::optional{4}}; + co_await Awaitable{driver, 2, std::optional{}}; // return early! + co_return n + co_await Awaitable{driver, 3, std::optional{8}}; +} + +int test_coro_shortcircuits_to_empty(const auto& expected) { + return check_coro_with_driver( + "test_coro_shortcircuits_to_empty", expected, [](test_driver& driver) { + return coro_shortcircuits_to_empty(driver); + }); +} + +template +std::optional coro_simple_await(test_driver& driver) { + co_return co_await Awaitable{driver, 1, std::optional{4}} + + co_await Awaitable{ + driver, 2, driver.toggles(test_toggles::dynamic_short_circuit) ? std::optional{} : std::optional{8}}; +} + +int test_coro_simple_await(const auto& expected) { + return check_coro_with_driver( + "test_coro_simple_await", expected, [](test_driver& driver) { + return coro_simple_await(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 +std::optional coro_catching_shortcircuits_to_empty(test_driver& driver) { +#ifndef TEST_HAS_NO_EXCEPTIONS + try { +#endif + T n = co_await Awaitable{driver, 1, std::optional{4}}; + co_await Awaitable{driver, 2, std::optional{}}; // return early! + co_return n + co_await Awaitable{driver, 3, std::optional{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, [](test_driver& driver) { + return coro_catching_shortcircuits_to_empty(driver); + }); +} + +template +std::optional coro_catching_simple_await(test_driver& driver) { +#ifndef TEST_HAS_NO_EXCEPTIONS + try { +#endif + co_return co_await Awaitable{driver, 1, std::optional{4}} + + co_await Awaitable{ + driver, 2, driver.toggles(test_toggles::dynamic_short_circuit) ? std::optional{} : std::optional{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, [](test_driver& driver) { + return coro_catching_simple_await(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 +std::optional noneliding_coro_shortcircuits_to_empty(test_driver& driver) { + T n = co_await Awaitable{driver, 1, std::optional{8}}; + T n2 = co_await old_optional_awaitable{driver, 2, std::optional{16}}; + co_await Awaitable{driver, 3, std::optional{}}; // return early! + co_return n + n2 + co_await Awaitable{driver, 4, std::optional{32}}; +} + +int test_noneliding_coro_shortcircuits_to_empty(const auto& expected) { + return check_coro_with_driver( + "test_noneliding_coro_shortcircuits_to_empty", expected, [](test_driver& driver) { + return noneliding_coro_shortcircuits_to_empty(driver); + }); +} + +template +std::optional noneliding_coro_simple_await(test_driver& driver) { + co_return co_await Awaitable{driver, 1, std::optional{4}} + + co_await Awaitable{ + driver, 2, driver.toggles(test_toggles::dynamic_short_circuit) ? std::optional{} : std::optional{8}} + + co_await old_optional_awaitable{driver, 3, std::optional{16}}; +} + +int test_noneliding_coro_simple_await(const auto& expected) { + return check_coro_with_driver( + "test_noneliding_coro_simple_await", expected, [](test_driver& driver) { + return noneliding_coro_simple_await(driver); + }); +} + +// Test nested coroutines (coroutines that await other coroutines) + +template +std::optional inner_coro(test_driver& driver, int base_id) { + co_return co_await Awaitable{driver, base_id, std::optional{8}} + + co_await Awaitable{ + driver, + base_id + 1, + driver.toggles(test_toggles::dynamic_short_circuit) ? std::optional{} : std::optional{16}}; +} + +template +std::optional outer_coro(test_driver& driver) { + T result1 = co_await Awaitable{driver, 1, inner_coro(driver, 32)}; + T result2 = co_await Awaitable{driver, 2, inner_coro(driver, 32)}; + co_return result1 + result2; +} + +int test_nested_coroutines(const auto& expected) { + return check_coro_with_driver( + "test_nested_coroutines", expected, [](test_driver& driver) { + return outer_coro(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 + ); +}