diff --git a/CoroutinesCodeGenerator.cpp b/CoroutinesCodeGenerator.cpp index b54b1e45..c9629f77 100644 --- a/CoroutinesCodeGenerator.cpp +++ b/CoroutinesCodeGenerator.cpp @@ -932,9 +932,21 @@ void CoroutinesCodeGenerator::InsertArg(const CoroutineSuspendExpr* stmt) StmtsContainer bodyStmts{}; Expr* initializeInitialAwaitResume = nullptr; - auto addInitialAwaitSuspendCalled = [&] { - bodyStmts.Add(bop); + const bool canThrow{[&] { + if(const auto* e = dyn_cast_or_null(stmt->getSuspendExpr())) { + if(const auto* ce = dyn_cast_or_null(e->getSubExpr())) { + if(const FunctionDecl* fd = ce->getDirectCallee()) { + if(const FunctionProtoType* fpt = fd->getType()->getAs()) { + return not fpt->isNothrow(/*ResultIfDependent=*/false); + } + } + } + } + + return true; + }()}; + auto addInitialAwaitSuspendCalled = [&] { if(eState::InitialSuspend == mState) { mState = eState::Body; // https://timsong-cpp.github.io/cppwp/n4861/dcl.fct.def.coroutine#5.3 @@ -944,8 +956,24 @@ void CoroutinesCodeGenerator::InsertArg(const CoroutineSuspendExpr* stmt) } }; + auto insertTryCatchIfNecessary = [&](StmtsContainer& cont) { + if(canThrow) { + auto* tryBody = mkCompoundStmt(cont); + + StmtsContainer catchBodyStmts{ + Assign(mASTData.mSuspendIndexAccess, mASTData.mSuspendIndexField, Int32(mSuspendsCount - 1)), Throw()}; + + cont.clear(); + cont.Add(Try(tryBody, Catch(catchBodyStmts))); + } + }; + if(returnsVoid) { + bodyStmts.Add(bop); bodyStmts.Add(stmt->getSuspendExpr()); + + insertTryCatchIfNecessary(bodyStmts); + addInitialAwaitSuspendCalled(); bodyStmts.Add(Return()); @@ -957,7 +985,10 @@ void CoroutinesCodeGenerator::InsertArg(const CoroutineSuspendExpr* stmt) auto* ifSuspend = If(stmt->getSuspendExpr(), bodyStmts); - InsertArg(If(Not(stmt->getReadyExpr()), ifSuspend)); + StmtsContainer innerBodyStmts{bop, ifSuspend}; + insertTryCatchIfNecessary(innerBodyStmts); + + InsertArg(If(Not(stmt->getReadyExpr()), innerBodyStmts)); } if(not returnsVoid and initializeInitialAwaitResume) { diff --git a/tests/EduCoroutineAllocFailureTest.expect b/tests/EduCoroutineAllocFailureTest.expect index 98a67e3e..61239f25 100644 --- a/tests/EduCoroutineAllocFailureTest.expect +++ b/tests/EduCoroutineAllocFailureTest.expect @@ -210,8 +210,8 @@ void __fun_intResume(__fun_intFrame * __f) /* co_await EduCoroutineAllocFailureTest.cpp:40 */ __f->__suspend_40_14 = __f->__promise.initial_suspend(); if(!__f->__suspend_40_14.await_ready()) { - __f->__suspend_40_14.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_40_14.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -234,8 +234,8 @@ void __fun_intResume(__fun_intFrame * __f) /* co_await EduCoroutineAllocFailureTest.cpp:40 */ __f->__suspend_40_14_1 = __f->__promise.final_suspend(); if(!__f->__suspend_40_14_1.await_ready()) { - __f->__suspend_40_14_1.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 2; + __f->__suspend_40_14_1.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } diff --git a/tests/EduCoroutineBinaryExprTest.expect b/tests/EduCoroutineBinaryExprTest.expect index 930aeef9..cc9a7f5f 100644 --- a/tests/EduCoroutineBinaryExprTest.expect +++ b/tests/EduCoroutineBinaryExprTest.expect @@ -146,8 +146,8 @@ void __seqResume(__seqFrame * __f) /* co_await EduCoroutineBinaryExprTest.cpp:35 */ __f->__suspend_35_11 = __f->__promise.initial_suspend(); if(!__f->__suspend_35_11.await_ready()) { - __f->__suspend_35_11.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_35_11.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -160,8 +160,8 @@ void __seqResume(__seqFrame * __f) /* co_yield EduCoroutineBinaryExprTest.cpp:42 */ __f->__suspend_42_5 = __f->__promise.yield_value(__f->s.t); if(!__f->__suspend_42_5.await_ready()) { - __f->__suspend_42_5.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 2; + __f->__suspend_42_5.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } @@ -171,8 +171,8 @@ void __seqResume(__seqFrame * __f) /* co_yield EduCoroutineBinaryExprTest.cpp:43 */ __f->__suspend_43_12 = __f->__promise.yield_value(__f->i); if(!__f->__suspend_43_12.await_ready()) { - __f->__suspend_43_12.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 3; + __f->__suspend_43_12.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } @@ -182,8 +182,8 @@ void __seqResume(__seqFrame * __f) /* co_yield EduCoroutineBinaryExprTest.cpp:44 */ __f->__suspend_44_23 = __f->__promise.yield_value(__f->i); if(!__f->__suspend_44_23.await_ready()) { - __f->__suspend_44_23.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 4; + __f->__suspend_44_23.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } @@ -193,8 +193,8 @@ void __seqResume(__seqFrame * __f) /* co_yield EduCoroutineBinaryExprTest.cpp:45 */ __f->__suspend_45_5 = __f->__promise.yield_value(__f->i + 1); if(!__f->__suspend_45_5.await_ready()) { - __f->__suspend_45_5.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 5; + __f->__suspend_45_5.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } @@ -216,8 +216,8 @@ void __seqResume(__seqFrame * __f) /* co_await EduCoroutineBinaryExprTest.cpp:35 */ __f->__suspend_35_11_1 = __f->__promise.final_suspend(); if(!__f->__suspend_35_11_1.await_ready()) { - __f->__suspend_35_11_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 6; + __f->__suspend_35_11_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } diff --git a/tests/EduCoroutineCaptureConstTest.expect b/tests/EduCoroutineCaptureConstTest.expect index 728b85f7..6b1c3bf4 100644 --- a/tests/EduCoroutineCaptureConstTest.expect +++ b/tests/EduCoroutineCaptureConstTest.expect @@ -137,8 +137,8 @@ void __seqResume(__seqFrame * __f) /* co_await EduCoroutineCaptureConstTest.cpp:35 */ __f->__suspend_35_11 = __f->__promise.initial_suspend(); if(!__f->__suspend_35_11.await_ready()) { - __f->__suspend_35_11.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_35_11.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -162,8 +162,8 @@ void __seqResume(__seqFrame * __f) /* co_await EduCoroutineCaptureConstTest.cpp:35 */ __f->__suspend_35_11_1 = __f->__promise.final_suspend(); if(!__f->__suspend_35_11_1.await_ready()) { - __f->__suspend_35_11_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 2; + __f->__suspend_35_11_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } diff --git a/tests/EduCoroutineCaptureThisTest.expect b/tests/EduCoroutineCaptureThisTest.expect index fd1634ef..e8a93b88 100644 --- a/tests/EduCoroutineCaptureThisTest.expect +++ b/tests/EduCoroutineCaptureThisTest.expect @@ -125,8 +125,8 @@ inline my_resumable coro(int x) /* co_await EduCoroutineCaptureThisTest.cpp:31 */ __f->__suspend_31_16 = __f->__promise.initial_suspend(); if(!__f->__suspend_31_16.await_ready()) { - __f->__suspend_31_16.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_31_16.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -150,8 +150,8 @@ inline my_resumable coro(int x) /* co_await EduCoroutineCaptureThisTest.cpp:31 */ __f->__suspend_31_16_1 = __f->__promise.final_suspend(); if(!__f->__suspend_31_16_1.await_ready()) { - __f->__suspend_31_16_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 2; + __f->__suspend_31_16_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } diff --git a/tests/EduCoroutineCoAwaitOperatorTest.cerr b/tests/EduCoroutineCoAwaitOperatorTest.cerr index 779a8dea..d7af51f4 100644 --- a/tests/EduCoroutineCoAwaitOperatorTest.cerr +++ b/tests/EduCoroutineCoAwaitOperatorTest.cerr @@ -1,7 +1,7 @@ .tmp.cpp:167:3: error: unknown type name 'awaiter' 167 | awaiter __suspend_54_5; | ^ -.tmp.cpp:250:10: warning: expression result unused [-Wunused-value] - 250 | __f->__suspend_56_14_res; +.tmp.cpp:262:10: warning: expression result unused [-Wunused-value] + 262 | __f->__suspend_56_14_res; | ~~~ ^~~~~~~~~~~~~~~~~~~ 1 warning and 1 error generated. diff --git a/tests/EduCoroutineCoAwaitOperatorTest.expect b/tests/EduCoroutineCoAwaitOperatorTest.expect index 2e48761d..a47afb46 100644 --- a/tests/EduCoroutineCoAwaitOperatorTest.expect +++ b/tests/EduCoroutineCoAwaitOperatorTest.expect @@ -215,8 +215,8 @@ void __gResume(__gFrame * __f) /* co_await EduCoroutineCoAwaitOperatorTest.cpp:51 */ __f->__suspend_51_16 = __f->__promise.initial_suspend(); if(!__f->__suspend_51_16.await_ready()) { - __f->__suspend_51_16.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_51_16.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -228,8 +228,14 @@ void __gResume(__gFrame * __f) /* co_await EduCoroutineCoAwaitOperatorTest.cpp:54 */ __f->__suspend_54_5 = operator co_await(std::operator""ms(10ULL)); if(!__f->__suspend_54_5.await_ready()) { - __f->__suspend_54_5.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); - __f->__suspend_index = 2; + try + { + __f->__suspend_index = 2; + __f->__suspend_54_5.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); + } catch(...) { + __f->__suspend_index = 1; + throw ; + } return; } @@ -240,8 +246,14 @@ void __gResume(__gFrame * __f) /* co_await EduCoroutineCoAwaitOperatorTest.cpp:56 */ __f->__suspend_56_14 = h(); if(!__f->__suspend_56_14.await_ready()) { - __f->__suspend_56_14.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); - __f->__suspend_index = 3; + try + { + __f->__suspend_index = 3; + __f->__suspend_56_14.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); + } catch(...) { + __f->__suspend_index = 2; + throw ; + } return; } @@ -264,8 +276,8 @@ void __gResume(__gFrame * __f) /* co_await EduCoroutineCoAwaitOperatorTest.cpp:51 */ __f->__suspend_51_16_1 = __f->__promise.final_suspend(); if(!__f->__suspend_51_16_1.await_ready()) { - __f->__suspend_51_16_1.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 4; + __f->__suspend_51_16_1.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } diff --git a/tests/EduCoroutineCoreturnWithCoawaitTest.cerr b/tests/EduCoroutineCoreturnWithCoawaitTest.cerr index 15eccd00..37d3cdbe 100644 --- a/tests/EduCoroutineCoreturnWithCoawaitTest.cerr +++ b/tests/EduCoroutineCoreturnWithCoawaitTest.cerr @@ -4,38 +4,38 @@ .tmp.cpp:69:10: note: copy assignment operator is implicitly deleted because 'generator' has a user-declared move constructor 69 | inline generator(generator && rhs) | ^ -.tmp.cpp:289:26: error: object of type 'generator' cannot be assigned because its copy assignment operator is implicitly deleted - 289 | __f->__suspend_56_51 = simpleReturn(__f->v + 1); +.tmp.cpp:295:26: error: object of type 'generator' cannot be assigned because its copy assignment operator is implicitly deleted + 295 | __f->__suspend_56_51 = simpleReturn(__f->v + 1); | ^ .tmp.cpp:69:10: note: copy assignment operator is implicitly deleted because 'generator' has a user-declared move constructor 69 | inline generator(generator && rhs) | ^ -.tmp.cpp:414:26: error: object of type 'generator' cannot be assigned because its copy assignment operator is implicitly deleted - 414 | __f->__suspend_60_24 = simpleReturn(__f->v); +.tmp.cpp:426:26: error: object of type 'generator' cannot be assigned because its copy assignment operator is implicitly deleted + 426 | __f->__suspend_60_24 = simpleReturn(__f->v); | ^ .tmp.cpp:69:10: note: copy assignment operator is implicitly deleted because 'generator' has a user-declared move constructor 69 | inline generator(generator && rhs) | ^ -.tmp.cpp:425:26: error: object of type 'generator' cannot be assigned because its copy assignment operator is implicitly deleted - 425 | __f->__suspend_60_51 = simpleReturn(__f->v + 1); +.tmp.cpp:443:26: error: object of type 'generator' cannot be assigned because its copy assignment operator is implicitly deleted + 443 | __f->__suspend_60_51 = simpleReturn(__f->v + 1); | ^ .tmp.cpp:69:10: note: copy assignment operator is implicitly deleted because 'generator' has a user-declared move constructor 69 | inline generator(generator && rhs) | ^ -.tmp.cpp:436:26: error: object of type 'generator' cannot be assigned because its copy assignment operator is implicitly deleted - 436 | __f->__suspend_60_80 = simpleReturn(__f->v + 2); +.tmp.cpp:460:26: error: object of type 'generator' cannot be assigned because its copy assignment operator is implicitly deleted + 460 | __f->__suspend_60_80 = simpleReturn(__f->v + 2); | ^ .tmp.cpp:69:10: note: copy assignment operator is implicitly deleted because 'generator' has a user-declared move constructor 69 | inline generator(generator && rhs) | ^ -.tmp.cpp:558:26: error: object of type 'generator' cannot be assigned because its copy assignment operator is implicitly deleted - 558 | __f->__suspend_67_24 = simpleReturn(__f->v); +.tmp.cpp:588:26: error: object of type 'generator' cannot be assigned because its copy assignment operator is implicitly deleted + 588 | __f->__suspend_67_24 = simpleReturn(__f->v); | ^ .tmp.cpp:69:10: note: copy assignment operator is implicitly deleted because 'generator' has a user-declared move constructor 69 | inline generator(generator && rhs) | ^ -.tmp.cpp:569:26: error: object of type 'generator' cannot be assigned because its copy assignment operator is implicitly deleted - 569 | __f->__suspend_67_51 = simpleReturn(__f->v + 1); +.tmp.cpp:605:26: error: object of type 'generator' cannot be assigned because its copy assignment operator is implicitly deleted + 605 | __f->__suspend_67_51 = simpleReturn(__f->v + 1); | ^ .tmp.cpp:69:10: note: copy assignment operator is implicitly deleted because 'generator' has a user-declared move constructor 69 | inline generator(generator && rhs) diff --git a/tests/EduCoroutineCoreturnWithCoawaitTest.expect b/tests/EduCoroutineCoreturnWithCoawaitTest.expect index 05617c40..667bcb74 100644 --- a/tests/EduCoroutineCoreturnWithCoawaitTest.expect +++ b/tests/EduCoroutineCoreturnWithCoawaitTest.expect @@ -154,8 +154,8 @@ void __simpleReturnResume(__simpleReturnFrame * __f) /* co_await EduCoroutineCoreturnWithCoawaitTest.cpp:50 */ __f->__suspend_50_11 = __f->__promise.initial_suspend(); if(!__f->__suspend_50_11.await_ready()) { - __f->__suspend_50_11.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_50_11.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -178,8 +178,8 @@ void __simpleReturnResume(__simpleReturnFrame * __f) /* co_await EduCoroutineCoreturnWithCoawaitTest.cpp:50 */ __f->__suspend_50_11_1 = __f->__promise.final_suspend(); if(!__f->__suspend_50_11_1.await_ready()) { - __f->__suspend_50_11_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 2; + __f->__suspend_50_11_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } @@ -265,8 +265,8 @@ void __additionAwaitReturnResume(__additionAwaitReturnFrame * __f) /* co_await EduCoroutineCoreturnWithCoawaitTest.cpp:55 */ __f->__suspend_55_11 = __f->__promise.initial_suspend(); if(!__f->__suspend_55_11.await_ready()) { - __f->__suspend_55_11.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_55_11.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -277,8 +277,14 @@ void __additionAwaitReturnResume(__additionAwaitReturnFrame * __f) /* co_await EduCoroutineCoreturnWithCoawaitTest.cpp:56 */ __f->__suspend_56_24 = simpleReturn(__f->v); if(!__f->__suspend_56_24.await_ready()) { - __f->__suspend_56_24.await_suspend(std::coroutine_handle::from_address(static_cast(__f))); - __f->__suspend_index = 2; + try + { + __f->__suspend_index = 2; + __f->__suspend_56_24.await_suspend(std::coroutine_handle::from_address(static_cast(__f))); + } catch(...) { + __f->__suspend_index = 1; + throw ; + } return; } @@ -288,8 +294,14 @@ void __additionAwaitReturnResume(__additionAwaitReturnFrame * __f) /* co_await EduCoroutineCoreturnWithCoawaitTest.cpp:56 */ __f->__suspend_56_51 = simpleReturn(__f->v + 1); if(!__f->__suspend_56_51.await_ready()) { - __f->__suspend_56_51.await_suspend(std::coroutine_handle::from_address(static_cast(__f))); - __f->__suspend_index = 3; + try + { + __f->__suspend_index = 3; + __f->__suspend_56_51.await_suspend(std::coroutine_handle::from_address(static_cast(__f))); + } catch(...) { + __f->__suspend_index = 2; + throw ; + } return; } @@ -311,8 +323,8 @@ void __additionAwaitReturnResume(__additionAwaitReturnFrame * __f) /* co_await EduCoroutineCoreturnWithCoawaitTest.cpp:55 */ __f->__suspend_55_11_1 = __f->__promise.final_suspend(); if(!__f->__suspend_55_11_1.await_ready()) { - __f->__suspend_55_11_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 4; + __f->__suspend_55_11_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } @@ -401,8 +413,8 @@ void __additionAwaitReturn2Resume(__additionAwaitReturn2Frame * __f) /* co_await EduCoroutineCoreturnWithCoawaitTest.cpp:59 */ __f->__suspend_59_11 = __f->__promise.initial_suspend(); if(!__f->__suspend_59_11.await_ready()) { - __f->__suspend_59_11.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_59_11.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -413,8 +425,14 @@ void __additionAwaitReturn2Resume(__additionAwaitReturn2Frame * __f) /* co_await EduCoroutineCoreturnWithCoawaitTest.cpp:60 */ __f->__suspend_60_24 = simpleReturn(__f->v); if(!__f->__suspend_60_24.await_ready()) { - __f->__suspend_60_24.await_suspend(std::coroutine_handle::from_address(static_cast(__f))); - __f->__suspend_index = 2; + try + { + __f->__suspend_index = 2; + __f->__suspend_60_24.await_suspend(std::coroutine_handle::from_address(static_cast(__f))); + } catch(...) { + __f->__suspend_index = 1; + throw ; + } return; } @@ -424,8 +442,14 @@ void __additionAwaitReturn2Resume(__additionAwaitReturn2Frame * __f) /* co_await EduCoroutineCoreturnWithCoawaitTest.cpp:60 */ __f->__suspend_60_51 = simpleReturn(__f->v + 1); if(!__f->__suspend_60_51.await_ready()) { - __f->__suspend_60_51.await_suspend(std::coroutine_handle::from_address(static_cast(__f))); - __f->__suspend_index = 3; + try + { + __f->__suspend_index = 3; + __f->__suspend_60_51.await_suspend(std::coroutine_handle::from_address(static_cast(__f))); + } catch(...) { + __f->__suspend_index = 2; + throw ; + } return; } @@ -435,8 +459,14 @@ void __additionAwaitReturn2Resume(__additionAwaitReturn2Frame * __f) /* co_await EduCoroutineCoreturnWithCoawaitTest.cpp:60 */ __f->__suspend_60_80 = simpleReturn(__f->v + 2); if(!__f->__suspend_60_80.await_ready()) { - __f->__suspend_60_80.await_suspend(std::coroutine_handle::from_address(static_cast(__f))); - __f->__suspend_index = 4; + try + { + __f->__suspend_index = 4; + __f->__suspend_60_80.await_suspend(std::coroutine_handle::from_address(static_cast(__f))); + } catch(...) { + __f->__suspend_index = 3; + throw ; + } return; } @@ -458,8 +488,8 @@ void __additionAwaitReturn2Resume(__additionAwaitReturn2Frame * __f) /* co_await EduCoroutineCoreturnWithCoawaitTest.cpp:59 */ __f->__suspend_59_11_1 = __f->__promise.final_suspend(); if(!__f->__suspend_59_11_1.await_ready()) { - __f->__suspend_59_11_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 5; + __f->__suspend_59_11_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } @@ -545,8 +575,8 @@ void __additionAwaitReturnWithIntResume(__additionAwaitReturnWithIntFrame * __f) /* co_await EduCoroutineCoreturnWithCoawaitTest.cpp:63 */ __f->__suspend_63_11 = __f->__promise.initial_suspend(); if(!__f->__suspend_63_11.await_ready()) { - __f->__suspend_63_11.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_63_11.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -557,8 +587,14 @@ void __additionAwaitReturnWithIntResume(__additionAwaitReturnWithIntFrame * __f) /* co_await EduCoroutineCoreturnWithCoawaitTest.cpp:67 */ __f->__suspend_67_24 = simpleReturn(__f->v); if(!__f->__suspend_67_24.await_ready()) { - __f->__suspend_67_24.await_suspend(std::coroutine_handle::from_address(static_cast(__f))); - __f->__suspend_index = 2; + try + { + __f->__suspend_index = 2; + __f->__suspend_67_24.await_suspend(std::coroutine_handle::from_address(static_cast(__f))); + } catch(...) { + __f->__suspend_index = 1; + throw ; + } return; } @@ -568,8 +604,14 @@ void __additionAwaitReturnWithIntResume(__additionAwaitReturnWithIntFrame * __f) /* co_await EduCoroutineCoreturnWithCoawaitTest.cpp:67 */ __f->__suspend_67_51 = simpleReturn(__f->v + 1); if(!__f->__suspend_67_51.await_ready()) { - __f->__suspend_67_51.await_suspend(std::coroutine_handle::from_address(static_cast(__f))); - __f->__suspend_index = 3; + try + { + __f->__suspend_index = 3; + __f->__suspend_67_51.await_suspend(std::coroutine_handle::from_address(static_cast(__f))); + } catch(...) { + __f->__suspend_index = 2; + throw ; + } return; } @@ -591,8 +633,8 @@ void __additionAwaitReturnWithIntResume(__additionAwaitReturnWithIntFrame * __f) /* co_await EduCoroutineCoreturnWithCoawaitTest.cpp:63 */ __f->__suspend_63_11_1 = __f->__promise.final_suspend(); if(!__f->__suspend_63_11_1.await_ready()) { - __f->__suspend_63_11_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 4; + __f->__suspend_63_11_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } diff --git a/tests/EduCoroutineCustomYieldTypeTest.expect b/tests/EduCoroutineCustomYieldTypeTest.expect index 6519798e..184a9eb7 100644 --- a/tests/EduCoroutineCustomYieldTypeTest.expect +++ b/tests/EduCoroutineCustomYieldTypeTest.expect @@ -214,8 +214,8 @@ void __seqResume(__seqFrame * __f) /* co_await EduCoroutineCustomYieldTypeTest.cpp:86 */ __f->__suspend_86_11 = __f->__promise.initial_suspend(); if(!__f->__suspend_86_11.await_ready()) { - __f->__suspend_86_11.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_86_11.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -227,11 +227,17 @@ void __seqResume(__seqFrame * __f) /* co_await EduCoroutineCustomYieldTypeTest.cpp:88 */ __f->__suspend_88_14 = auto_await_suspend{}; if(!__f->__suspend_88_14.await_ready()) { - if(__f->__suspend_88_14.await_suspend >(std::coroutine_handle::from_address(static_cast(__f)))) { + try + { __f->__suspend_index = 2; - return; - } - + if(__f->__suspend_88_14.await_suspend >(std::coroutine_handle::from_address(static_cast(__f)))) { + return; + } + + } catch(...) { + __f->__suspend_index = 1; + throw ; + } } __resume_seq_2: @@ -254,8 +260,8 @@ void __seqResume(__seqFrame * __f) /* co_await EduCoroutineCustomYieldTypeTest.cpp:86 */ __f->__suspend_86_11_1 = __f->__promise.final_suspend(); if(!__f->__suspend_86_11_1.await_ready()) { - __f->__suspend_86_11_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 3; + __f->__suspend_86_11_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } diff --git a/tests/EduCoroutineExprTest.expect b/tests/EduCoroutineExprTest.expect index a6fa1af7..f2b92f49 100644 --- a/tests/EduCoroutineExprTest.expect +++ b/tests/EduCoroutineExprTest.expect @@ -287,8 +287,8 @@ void __get_randomResume(__get_randomFrame * __f) /* co_await EduCoroutineExprTest.cpp:77 */ __f->__suspend_77_11 = __f->__promise.initial_suspend(); if(!__f->__suspend_77_11.await_ready()) { - __f->__suspend_77_11.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_77_11.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -312,8 +312,8 @@ void __get_randomResume(__get_randomFrame * __f) /* co_await EduCoroutineExprTest.cpp:77 */ __f->__suspend_77_11_1 = __f->__promise.final_suspend(); if(!__f->__suspend_77_11_1.await_ready()) { + __f->__suspend_index = 2; if(__f->__suspend_77_11_1.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f))).address()) { - __f->__suspend_index = 2; return; } @@ -412,8 +412,8 @@ void __testVarDeclAndConditionalResume(__testVarDeclAndConditionalFrame * __f) /* co_await EduCoroutineExprTest.cpp:85 */ __f->__suspend_85_11 = __f->__promise.initial_suspend(); if(!__f->__suspend_85_11.await_ready()) { - __f->__suspend_85_11.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_85_11.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -426,8 +426,8 @@ void __testVarDeclAndConditionalResume(__testVarDeclAndConditionalFrame * __f) /* co_await EduCoroutineExprTest.cpp:90 */ __f->__suspend_90_17 = __f->v.operator co_await(); if(!__f->__suspend_90_17.await_ready()) { + __f->__suspend_index = 2; if(__f->__suspend_90_17.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()).address()) { - __f->__suspend_index = 2; return; } @@ -439,8 +439,8 @@ void __testVarDeclAndConditionalResume(__testVarDeclAndConditionalFrame * __f) /* co_await EduCoroutineExprTest.cpp:90 */ __f->__suspend_90_30 = __f->u.operator co_await(); if(!__f->__suspend_90_30.await_ready()) { + __f->__suspend_index = 3; if(__f->__suspend_90_30.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()).address()) { - __f->__suspend_index = 3; return; } @@ -453,8 +453,8 @@ void __testVarDeclAndConditionalResume(__testVarDeclAndConditionalFrame * __f) /* co_await EduCoroutineExprTest.cpp:92 */ __f->__suspend_92_14 = __f->v.operator co_await(); if(!__f->__suspend_92_14.await_ready()) { + __f->__suspend_index = 4; if(__f->__suspend_92_14.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()).address()) { - __f->__suspend_index = 4; return; } @@ -466,8 +466,8 @@ void __testVarDeclAndConditionalResume(__testVarDeclAndConditionalFrame * __f) /* co_await EduCoroutineExprTest.cpp:92 */ __f->__suspend_92_27 = __f->v.operator co_await(); if(!__f->__suspend_92_27.await_ready()) { + __f->__suspend_index = 5; if(__f->__suspend_92_27.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()).address()) { - __f->__suspend_index = 5; return; } @@ -479,8 +479,8 @@ void __testVarDeclAndConditionalResume(__testVarDeclAndConditionalFrame * __f) /* co_await EduCoroutineExprTest.cpp:92 */ __f->__suspend_92_42 = __f->v.operator co_await(); if(!__f->__suspend_92_42.await_ready()) { + __f->__suspend_index = 6; if(__f->__suspend_92_42.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()).address()) { - __f->__suspend_index = 6; return; } @@ -493,8 +493,8 @@ void __testVarDeclAndConditionalResume(__testVarDeclAndConditionalFrame * __f) /* co_await EduCoroutineExprTest.cpp:94 */ __f->__suspend_94_22 = __f->v.operator co_await(); if(!__f->__suspend_94_22.await_ready()) { + __f->__suspend_index = 7; if(__f->__suspend_94_22.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()).address()) { - __f->__suspend_index = 7; return; } @@ -518,8 +518,8 @@ void __testVarDeclAndConditionalResume(__testVarDeclAndConditionalFrame * __f) /* co_await EduCoroutineExprTest.cpp:85 */ __f->__suspend_85_11_1 = __f->__promise.final_suspend(); if(!__f->__suspend_85_11_1.await_ready()) { + __f->__suspend_index = 8; if(__f->__suspend_85_11_1.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f))).address()) { - __f->__suspend_index = 8; return; } @@ -609,8 +609,8 @@ void __testIfStmtResume(__testIfStmtFrame * __f) /* co_await EduCoroutineExprTest.cpp:96 */ __f->__suspend_96_11 = __f->__promise.initial_suspend(); if(!__f->__suspend_96_11.await_ready()) { - __f->__suspend_96_11.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_96_11.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -623,8 +623,8 @@ void __testIfStmtResume(__testIfStmtFrame * __f) /* co_await EduCoroutineExprTest.cpp:101 */ __f->__suspend_101_8 = __f->v.operator co_await(); if(!__f->__suspend_101_8.await_ready()) { + __f->__suspend_index = 2; if(__f->__suspend_101_8.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()).address()) { - __f->__suspend_index = 2; return; } @@ -636,8 +636,8 @@ void __testIfStmtResume(__testIfStmtFrame * __f) /* co_await EduCoroutineExprTest.cpp:101 */ __f->__suspend_101_21 = __f->u.operator co_await(); if(!__f->__suspend_101_21.await_ready()) { + __f->__suspend_index = 3; if(__f->__suspend_101_21.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()).address()) { - __f->__suspend_index = 3; return; } @@ -650,8 +650,8 @@ void __testIfStmtResume(__testIfStmtFrame * __f) /* co_await EduCoroutineExprTest.cpp:103 */ __f->__suspend_103_19 = __f->v.operator co_await(); if(!__f->__suspend_103_19.await_ready()) { + __f->__suspend_index = 4; if(__f->__suspend_103_19.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()).address()) { - __f->__suspend_index = 4; return; } @@ -665,8 +665,8 @@ void __testIfStmtResume(__testIfStmtFrame * __f) /* co_await EduCoroutineExprTest.cpp:105 */ __f->__suspend_105_18 = __f->v.operator co_await(); if(!__f->__suspend_105_18.await_ready()) { + __f->__suspend_index = 5; if(__f->__suspend_105_18.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()).address()) { - __f->__suspend_index = 5; return; } @@ -693,8 +693,8 @@ void __testIfStmtResume(__testIfStmtFrame * __f) /* co_await EduCoroutineExprTest.cpp:96 */ __f->__suspend_96_11_1 = __f->__promise.final_suspend(); if(!__f->__suspend_96_11_1.await_ready()) { + __f->__suspend_index = 6; if(__f->__suspend_96_11_1.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f))).address()) { - __f->__suspend_index = 6; return; } @@ -773,8 +773,8 @@ void __testCallExprResume(__testCallExprFrame * __f) /* co_await EduCoroutineExprTest.cpp:111 */ __f->__suspend_111_11 = __f->__promise.initial_suspend(); if(!__f->__suspend_111_11.await_ready()) { - __f->__suspend_111_11.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_111_11.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -786,8 +786,8 @@ void __testCallExprResume(__testCallExprFrame * __f) /* co_await EduCoroutineExprTest.cpp:115 */ __f->__suspend_115_10 = __f->v.operator co_await(); if(!__f->__suspend_115_10.await_ready()) { + __f->__suspend_index = 2; if(__f->__suspend_115_10.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()).address()) { - __f->__suspend_index = 2; return; } @@ -812,8 +812,8 @@ void __testCallExprResume(__testCallExprFrame * __f) /* co_await EduCoroutineExprTest.cpp:111 */ __f->__suspend_111_11_1 = __f->__promise.final_suspend(); if(!__f->__suspend_111_11_1.await_ready()) { + __f->__suspend_index = 3; if(__f->__suspend_111_11_1.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f))).address()) { - __f->__suspend_index = 3; return; } @@ -892,8 +892,8 @@ void __testSwitchResume(__testSwitchFrame * __f) /* co_await EduCoroutineExprTest.cpp:120 */ __f->__suspend_120_11 = __f->__promise.initial_suspend(); if(!__f->__suspend_120_11.await_ready()) { - __f->__suspend_120_11.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_120_11.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -905,8 +905,8 @@ void __testSwitchResume(__testSwitchFrame * __f) /* co_await EduCoroutineExprTest.cpp:124 */ __f->__suspend_124_12 = __f->v.operator co_await(); if(!__f->__suspend_124_12.await_ready()) { + __f->__suspend_index = 2; if(__f->__suspend_124_12.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()).address()) { - __f->__suspend_index = 2; return; } @@ -933,8 +933,8 @@ void __testSwitchResume(__testSwitchFrame * __f) /* co_await EduCoroutineExprTest.cpp:120 */ __f->__suspend_120_11_1 = __f->__promise.final_suspend(); if(!__f->__suspend_120_11_1.await_ready()) { + __f->__suspend_index = 3; if(__f->__suspend_120_11_1.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f))).address()) { - __f->__suspend_index = 3; return; } @@ -1014,8 +1014,8 @@ void __testWhileResume(__testWhileFrame * __f) /* co_await EduCoroutineExprTest.cpp:131 */ __f->__suspend_131_11 = __f->__promise.initial_suspend(); if(!__f->__suspend_131_11.await_ready()) { - __f->__suspend_131_11.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_131_11.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -1027,8 +1027,8 @@ void __testWhileResume(__testWhileFrame * __f) /* co_await EduCoroutineExprTest.cpp:135 */ __f->__suspend_135_11 = __f->v.operator co_await(); if(!__f->__suspend_135_11.await_ready()) { + __f->__suspend_index = 2; if(__f->__suspend_135_11.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()).address()) { - __f->__suspend_index = 2; return; } @@ -1056,8 +1056,8 @@ void __testWhileResume(__testWhileFrame * __f) /* co_await EduCoroutineExprTest.cpp:131 */ __f->__suspend_131_11_1 = __f->__promise.final_suspend(); if(!__f->__suspend_131_11_1.await_ready()) { + __f->__suspend_index = 3; if(__f->__suspend_131_11_1.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f))).address()) { - __f->__suspend_index = 3; return; } @@ -1137,8 +1137,8 @@ void __testDoWhileResume(__testDoWhileFrame * __f) /* co_await EduCoroutineExprTest.cpp:142 */ __f->__suspend_142_11 = __f->__promise.initial_suspend(); if(!__f->__suspend_142_11.await_ready()) { - __f->__suspend_142_11.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_142_11.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -1150,8 +1150,8 @@ void __testDoWhileResume(__testDoWhileFrame * __f) /* co_await EduCoroutineExprTest.cpp:148 */ __f->__suspend_148_13 = __f->v.operator co_await(); if(!__f->__suspend_148_13.await_ready()) { + __f->__suspend_index = 2; if(__f->__suspend_148_13.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()).address()) { - __f->__suspend_index = 2; return; } @@ -1179,8 +1179,8 @@ void __testDoWhileResume(__testDoWhileFrame * __f) /* co_await EduCoroutineExprTest.cpp:142 */ __f->__suspend_142_11_1 = __f->__promise.final_suspend(); if(!__f->__suspend_142_11_1.await_ready()) { + __f->__suspend_index = 3; if(__f->__suspend_142_11_1.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f))).address()) { - __f->__suspend_index = 3; return; } @@ -1268,8 +1268,8 @@ void __testForLoopResume(__testForLoopFrame * __f) /* co_await EduCoroutineExprTest.cpp:154 */ __f->__suspend_154_11 = __f->__promise.initial_suspend(); if(!__f->__suspend_154_11.await_ready()) { - __f->__suspend_154_11.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_154_11.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -1281,8 +1281,8 @@ void __testForLoopResume(__testForLoopFrame * __f) /* co_await EduCoroutineExprTest.cpp:159 */ __f->__suspend_159_9 = __f->v.operator co_await(); if(!__f->__suspend_159_9.await_ready()) { + __f->__suspend_index = 2; if(__f->__suspend_159_9.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()).address()) { - __f->__suspend_index = 2; return; } @@ -1294,8 +1294,8 @@ void __testForLoopResume(__testForLoopFrame * __f) /* co_await EduCoroutineExprTest.cpp:159 */ __f->__suspend_159_26 = __f->v.operator co_await(); if(!__f->__suspend_159_26.await_ready()) { + __f->__suspend_index = 3; if(__f->__suspend_159_26.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()).address()) { - __f->__suspend_index = 3; return; } @@ -1307,8 +1307,8 @@ void __testForLoopResume(__testForLoopFrame * __f) /* co_await EduCoroutineExprTest.cpp:159 */ __f->__suspend_159_38 = __f->v.operator co_await(); if(!__f->__suspend_159_38.await_ready()) { + __f->__suspend_index = 4; if(__f->__suspend_159_38.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()).address()) { - __f->__suspend_index = 4; return; } @@ -1321,8 +1321,8 @@ void __testForLoopResume(__testForLoopFrame * __f) /* co_await EduCoroutineExprTest.cpp:161 */ __f->__suspend_161_9 = __f->v.operator co_await(); if(!__f->__suspend_161_9.await_ready()) { + __f->__suspend_index = 5; if(__f->__suspend_161_9.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()).address()) { - __f->__suspend_index = 5; return; } @@ -1349,8 +1349,8 @@ void __testForLoopResume(__testForLoopFrame * __f) /* co_await EduCoroutineExprTest.cpp:154 */ __f->__suspend_154_11_1 = __f->__promise.final_suspend(); if(!__f->__suspend_154_11_1.await_ready()) { + __f->__suspend_index = 6; if(__f->__suspend_154_11_1.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f))).address()) { - __f->__suspend_index = 6; return; } diff --git a/tests/EduCoroutineFunctionTemplateTest.expect b/tests/EduCoroutineFunctionTemplateTest.expect index 95c8b9ff..365a0ceb 100644 --- a/tests/EduCoroutineFunctionTemplateTest.expect +++ b/tests/EduCoroutineFunctionTemplateTest.expect @@ -204,8 +204,8 @@ void __fun_int_char_unsignedint_3_1400000000000001Resume(__fun_int_char_unsigned /* co_await EduCoroutineFunctionTemplateTest.cpp:43 */ __f->__suspend_43_14 = __f->__promise.initial_suspend(); if(!__f->__suspend_43_14.await_ready()) { - __f->__suspend_43_14.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_43_14.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -228,8 +228,8 @@ void __fun_int_char_unsignedint_3_1400000000000001Resume(__fun_int_char_unsigned /* co_await EduCoroutineFunctionTemplateTest.cpp:43 */ __f->__suspend_43_14_1 = __f->__promise.final_suspend(); if(!__f->__suspend_43_14_1.await_ready()) { - __f->__suspend_43_14_1.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 2; + __f->__suspend_43_14_1.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } @@ -308,8 +308,8 @@ void __fun_int_char_unsignedint_ClsAsNTTPToCoro_4_n3_000000e_00_Resume(__fun_int /* co_await EduCoroutineFunctionTemplateTest.cpp:43 */ __f->__suspend_43_14 = __f->__promise.initial_suspend(); if(!__f->__suspend_43_14.await_ready()) { - __f->__suspend_43_14.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_43_14.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -332,8 +332,8 @@ void __fun_int_char_unsignedint_ClsAsNTTPToCoro_4_n3_000000e_00_Resume(__fun_int /* co_await EduCoroutineFunctionTemplateTest.cpp:43 */ __f->__suspend_43_14_1 = __f->__promise.final_suspend(); if(!__f->__suspend_43_14_1.await_ready()) { - __f->__suspend_43_14_1.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 2; + __f->__suspend_43_14_1.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } diff --git a/tests/EduCoroutineSimpleTest.expect b/tests/EduCoroutineSimpleTest.expect index ceb0f135..7a4eb61e 100644 --- a/tests/EduCoroutineSimpleTest.expect +++ b/tests/EduCoroutineSimpleTest.expect @@ -127,8 +127,8 @@ void __funResume(__funFrame * __f) /* co_await EduCoroutineSimpleTest.cpp:34 */ __f->__suspend_34_11 = __f->__promise.initial_suspend(); if(!__f->__suspend_34_11.await_ready()) { - __f->__suspend_34_11.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_34_11.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -151,8 +151,8 @@ void __funResume(__funFrame * __f) /* co_await EduCoroutineSimpleTest.cpp:34 */ __f->__suspend_34_11_1 = __f->__promise.final_suspend(); if(!__f->__suspend_34_11_1.await_ready()) { - __f->__suspend_34_11_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 2; + __f->__suspend_34_11_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } diff --git a/tests/EduCoroutineStaticVarTest.expect b/tests/EduCoroutineStaticVarTest.expect index 496aecc7..4b452bc8 100644 --- a/tests/EduCoroutineStaticVarTest.expect +++ b/tests/EduCoroutineStaticVarTest.expect @@ -150,8 +150,8 @@ void __taskAResume(__taskAFrame * __f) /* co_await EduCoroutineStaticVarTest.cpp:58 */ __f->__suspend_58_6 = __f->__promise.initial_suspend(); if(!__f->__suspend_58_6.await_ready()) { - __f->__suspend_58_6.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_58_6.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -163,8 +163,8 @@ void __taskAResume(__taskAFrame * __f) /* co_await EduCoroutineStaticVarTest.cpp:62 */ __f->__suspend_62_18 = __f->sched.suspend(); if(!__f->__suspend_62_18.await_ready()) { - __f->__suspend_62_18.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 2; + __f->__suspend_62_18.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } @@ -188,8 +188,8 @@ void __taskAResume(__taskAFrame * __f) /* co_await EduCoroutineStaticVarTest.cpp:58 */ __f->__suspend_58_6_1 = __f->__promise.final_suspend(); if(!__f->__suspend_58_6_1.await_ready()) { - __f->__suspend_58_6_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 3; + __f->__suspend_58_6_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } diff --git a/tests/EduCoroutineSuspendNeverBoolTest.expect b/tests/EduCoroutineSuspendNeverBoolTest.expect index f84fb834..fab83696 100644 --- a/tests/EduCoroutineSuspendNeverBoolTest.expect +++ b/tests/EduCoroutineSuspendNeverBoolTest.expect @@ -217,8 +217,8 @@ void __fun_intResume(__fun_intFrame * __f) /* co_await EduCoroutineSuspendNeverBoolTest.cpp:41 */ __f->__suspend_41_14 = __f->__promise.initial_suspend(); if(!__f->__suspend_41_14.await_ready()) { + __f->__suspend_index = 1; if(__f->__suspend_41_14.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle())) { - __f->__suspend_index = 1; __f->__initial_await_suspend_called = true; return; } @@ -234,8 +234,8 @@ void __fun_intResume(__fun_intFrame * __f) /* co_yield EduCoroutineSuspendNeverBoolTest.cpp:43 */ __f->__suspend_43_5 = __f->__promise.yield_value(2); if(!__f->__suspend_43_5.await_ready()) { + __f->__suspend_index = 2; if(__f->__suspend_43_5.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle())) { - __f->__suspend_index = 2; return; } @@ -259,8 +259,8 @@ void __fun_intResume(__fun_intFrame * __f) /* co_await EduCoroutineSuspendNeverBoolTest.cpp:41 */ __f->__suspend_41_14_1 = __f->__promise.final_suspend(); if(!__f->__suspend_41_14_1.await_ready()) { + __f->__suspend_index = 3; if(__f->__suspend_41_14_1.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle())) { - __f->__suspend_index = 3; return; } diff --git a/tests/EduCoroutineSuspendNeverTest.expect b/tests/EduCoroutineSuspendNeverTest.expect index 318c6936..4947e0de 100644 --- a/tests/EduCoroutineSuspendNeverTest.expect +++ b/tests/EduCoroutineSuspendNeverTest.expect @@ -200,8 +200,8 @@ void __fun_intResume(__fun_intFrame * __f) /* co_await EduCoroutineSuspendNeverTest.cpp:34 */ __f->__suspend_34_14 = __f->__promise.initial_suspend(); if(!__f->__suspend_34_14.await_ready()) { - __f->__suspend_34_14.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_34_14.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -213,8 +213,8 @@ void __fun_intResume(__fun_intFrame * __f) /* co_yield EduCoroutineSuspendNeverTest.cpp:36 */ __f->__suspend_36_5 = __f->__promise.yield_value(2); if(!__f->__suspend_36_5.await_ready()) { - __f->__suspend_36_5.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 2; + __f->__suspend_36_5.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } @@ -236,8 +236,8 @@ void __fun_intResume(__fun_intFrame * __f) /* co_await EduCoroutineSuspendNeverTest.cpp:34 */ __f->__suspend_34_14_1 = __f->__promise.final_suspend(); if(!__f->__suspend_34_14_1.await_ready()) { - __f->__suspend_34_14_1.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 3; + __f->__suspend_34_14_1.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } diff --git a/tests/EduCoroutineTemplateGeneratorTest.expect b/tests/EduCoroutineTemplateGeneratorTest.expect index d7366d55..0efbd7e8 100644 --- a/tests/EduCoroutineTemplateGeneratorTest.expect +++ b/tests/EduCoroutineTemplateGeneratorTest.expect @@ -195,8 +195,8 @@ void __fun_intResume(__fun_intFrame * __f) /* co_await EduCoroutineTemplateGeneratorTest.cpp:34 */ __f->__suspend_34_14 = __f->__promise.initial_suspend(); if(!__f->__suspend_34_14.await_ready()) { - __f->__suspend_34_14.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_34_14.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -219,8 +219,8 @@ void __fun_intResume(__fun_intFrame * __f) /* co_await EduCoroutineTemplateGeneratorTest.cpp:34 */ __f->__suspend_34_14_1 = __f->__promise.final_suspend(); if(!__f->__suspend_34_14_1.await_ready()) { - __f->__suspend_34_14_1.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 2; + __f->__suspend_34_14_1.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } diff --git a/tests/EduCoroutineVoidTest.expect b/tests/EduCoroutineVoidTest.expect index cbc2fffc..0e26f2e8 100644 --- a/tests/EduCoroutineVoidTest.expect +++ b/tests/EduCoroutineVoidTest.expect @@ -203,8 +203,8 @@ void __seq_intResume(__seq_intFrame * __f) /* co_await EduCoroutineVoidTest.cpp:34 */ __f->__suspend_34_14 = __f->__promise.initial_suspend(); if(!__f->__suspend_34_14.await_ready()) { - __f->__suspend_34_14.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_34_14.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -216,8 +216,8 @@ void __seq_intResume(__seq_intFrame * __f) /* co_yield EduCoroutineVoidTest.cpp:36 */ __f->__suspend_36_5 = __f->__promise.yield_value(__f->i); if(!__f->__suspend_36_5.await_ready()) { - __f->__suspend_36_5.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 2; + __f->__suspend_36_5.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } @@ -241,8 +241,8 @@ void __seq_intResume(__seq_intFrame * __f) /* co_await EduCoroutineVoidTest.cpp:34 */ __f->__suspend_34_14_1 = __f->__promise.final_suspend(); if(!__f->__suspend_34_14_1.await_ready()) { - __f->__suspend_34_14_1.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 3; + __f->__suspend_34_14_1.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } diff --git a/tests/EduCoroutineWithDtorTest.expect b/tests/EduCoroutineWithDtorTest.expect index 7c4b26be..f0a0e9a3 100644 --- a/tests/EduCoroutineWithDtorTest.expect +++ b/tests/EduCoroutineWithDtorTest.expect @@ -213,8 +213,8 @@ void __fun_TestResume(__fun_TestFrame * __f) /* co_await EduCoroutineWithDtorTest.cpp:43 */ __f->__suspend_43_14 = __f->__promise.initial_suspend(); if(!__f->__suspend_43_14.await_ready()) { - __f->__suspend_43_14.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_43_14.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -237,8 +237,8 @@ void __fun_TestResume(__fun_TestFrame * __f) /* co_await EduCoroutineWithDtorTest.cpp:43 */ __f->__suspend_43_14_1 = __f->__promise.final_suspend(); if(!__f->__suspend_43_14_1.await_ready()) { - __f->__suspend_43_14_1.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 2; + __f->__suspend_43_14_1.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } diff --git a/tests/EduCoroutineWithExceptionHandlerTest.expect b/tests/EduCoroutineWithExceptionHandlerTest.expect index b0b62968..7d8291ee 100644 --- a/tests/EduCoroutineWithExceptionHandlerTest.expect +++ b/tests/EduCoroutineWithExceptionHandlerTest.expect @@ -211,8 +211,8 @@ void __fun_intResume(__fun_intFrame * __f) /* co_await EduCoroutineWithExceptionHandlerTest.cpp:41 */ __f->__suspend_41_14 = __f->__promise.initial_suspend(); if(!__f->__suspend_41_14.await_ready()) { - __f->__suspend_41_14.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_41_14.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -235,8 +235,8 @@ void __fun_intResume(__fun_intFrame * __f) /* co_await EduCoroutineWithExceptionHandlerTest.cpp:41 */ __f->__suspend_41_14_1 = __f->__promise.final_suspend(); if(!__f->__suspend_41_14_1.await_ready()) { - __f->__suspend_41_14_1.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 2; + __f->__suspend_41_14_1.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } diff --git a/tests/EduCoroutineWithLambdaTest.expect b/tests/EduCoroutineWithLambdaTest.expect index f29fb908..2be9cdd0 100644 --- a/tests/EduCoroutineWithLambdaTest.expect +++ b/tests/EduCoroutineWithLambdaTest.expect @@ -156,8 +156,8 @@ inline generator operator()() const /* co_await EduCoroutineWithLambdaTest.cpp:45 */ __f->__suspend_45_24 = __f->__promise.initial_suspend(); if(!__f->__suspend_45_24.await_ready()) { - __f->__suspend_45_24.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_45_24.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -168,8 +168,8 @@ inline generator operator()() const /* co_await EduCoroutineWithLambdaTest.cpp:45 */ __f->__suspend_45_54 = a; if(!__f->__suspend_45_54.await_ready()) { - __f->__suspend_45_54.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 2; + __f->__suspend_45_54.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } @@ -191,8 +191,8 @@ inline generator operator()() const /* co_await EduCoroutineWithLambdaTest.cpp:45 */ __f->__suspend_45_24_1 = __f->__promise.final_suspend(); if(!__f->__suspend_45_24_1.await_ready()) { - __f->__suspend_45_24_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 3; + __f->__suspend_45_24_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } diff --git a/tests/Issue518.expect b/tests/Issue518.expect index 957c0cb0..da0ce792 100644 --- a/tests/Issue518.expect +++ b/tests/Issue518.expect @@ -291,8 +291,8 @@ void __get_randomResume(__get_randomFrame * __f) /* co_await Issue518.cpp:77 */ __f->__suspend_77_11 = __f->__promise.initial_suspend(); if(!__f->__suspend_77_11.await_ready()) { - __f->__suspend_77_11.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_77_11.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -316,8 +316,8 @@ void __get_randomResume(__get_randomFrame * __f) /* co_await Issue518.cpp:77 */ __f->__suspend_77_11_1 = __f->__promise.final_suspend(); if(!__f->__suspend_77_11_1.await_ready()) { + __f->__suspend_index = 2; if(__f->__suspend_77_11_1.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f))).address()) { - __f->__suspend_index = 2; return; } @@ -401,8 +401,8 @@ void __testResume(__testFrame * __f) /* co_await Issue518.cpp:83 */ __f->__suspend_83_11 = __f->__promise.initial_suspend(); if(!__f->__suspend_83_11.await_ready()) { - __f->__suspend_83_11.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_83_11.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -416,8 +416,8 @@ void __testResume(__testFrame * __f) /* co_await Issue518.cpp:88 */ __f->__suspend_88_17 = __f->v.operator co_await(); if(!__f->__suspend_88_17.await_ready()) { + __f->__suspend_index = 2; if(__f->__suspend_88_17.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()).address()) { - __f->__suspend_index = 2; return; } @@ -429,8 +429,8 @@ void __testResume(__testFrame * __f) /* co_await Issue518.cpp:88 */ __f->__suspend_88_30 = __f->u.operator co_await(); if(!__f->__suspend_88_30.await_ready()) { + __f->__suspend_index = 3; if(__f->__suspend_88_30.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f)).operator std::coroutine_handle()).address()) { - __f->__suspend_index = 3; return; } @@ -455,8 +455,8 @@ void __testResume(__testFrame * __f) /* co_await Issue518.cpp:83 */ __f->__suspend_83_11_1 = __f->__promise.final_suspend(); if(!__f->__suspend_83_11_1.await_ready()) { + __f->__suspend_index = 4; if(__f->__suspend_83_11_1.await_suspend(std::coroutine_handle::promise_type>::from_address(static_cast(__f))).address()) { - __f->__suspend_index = 4; return; } diff --git a/tests/Issue526.expect b/tests/Issue526.expect index d8a04da1..c2c23c5b 100644 --- a/tests/Issue526.expect +++ b/tests/Issue526.expect @@ -77,8 +77,8 @@ static inline hello_world execute() /* co_await Issue526.cpp:9 */ __f->__suspend_9_30 = __f->__promise.initial_suspend(); if(!__f->__suspend_9_30.await_ready()) { - __f->__suspend_9_30.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_9_30.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -89,8 +89,8 @@ static inline hello_world execute() /* co_await Issue526.cpp:9 */ __f->__suspend_9_51 = hello_logic{}; if(!__f->__suspend_9_51.await_ready()) { - __f->__suspend_9_51.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 2; + __f->__suspend_9_51.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } @@ -112,8 +112,8 @@ static inline hello_world execute() /* co_await Issue526.cpp:9 */ __f->__suspend_9_30_1 = __f->__promise.final_suspend(); if(!__f->__suspend_9_30_1.await_ready()) { - __f->__suspend_9_30_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 3; + __f->__suspend_9_30_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } diff --git a/tests/Issue536.expect b/tests/Issue536.expect index af348b48..a5d58c2d 100644 --- a/tests/Issue536.expect +++ b/tests/Issue536.expect @@ -135,8 +135,8 @@ void __coroResume(__coroFrame * __f) /* co_await Issue536.cpp:37 */ __f->__suspend_37_14 = __f->__promise.initial_suspend(); if(!__f->__suspend_37_14.await_ready()) { - __f->__suspend_37_14.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_37_14.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -162,8 +162,8 @@ void __coroResume(__coroFrame * __f) /* co_await Issue536.cpp:37 */ __f->__suspend_37_14_1 = __f->__promise.final_suspend(); if(!__f->__suspend_37_14_1.await_ready()) { - __f->__suspend_37_14_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 2; + __f->__suspend_37_14_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } diff --git a/tests/Issue536_2.expect b/tests/Issue536_2.expect index a42df6b7..3a194050 100644 --- a/tests/Issue536_2.expect +++ b/tests/Issue536_2.expect @@ -124,8 +124,8 @@ inline my_resumable coro(int x) const /* co_await Issue536_2.cpp:29 */ __f->__suspend_29_16 = __f->__promise.initial_suspend(); if(!__f->__suspend_29_16.await_ready()) { - __f->__suspend_29_16.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_29_16.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -151,8 +151,8 @@ inline my_resumable coro(int x) const /* co_await Issue536_2.cpp:29 */ __f->__suspend_29_16_1 = __f->__promise.final_suspend(); if(!__f->__suspend_29_16_1.await_ready()) { - __f->__suspend_29_16_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 2; + __f->__suspend_29_16_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } diff --git a/tests/Issue628.expect b/tests/Issue628.expect index fc3c7fb4..a806644c 100644 --- a/tests/Issue628.expect +++ b/tests/Issue628.expect @@ -156,8 +156,8 @@ void __fooResume(__fooFrame * __f) /* co_await Issue628.cpp:46 */ __f->__suspend_46_6 = __f->__promise.initial_suspend(); if(!__f->__suspend_46_6.await_ready()) { - __f->__suspend_46_6.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_46_6.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -170,8 +170,8 @@ void __fooResume(__fooFrame * __f) /* co_await Issue628.cpp:49 */ __f->__suspend_49_18 = mysleep{10}; if(!__f->__suspend_49_18.await_ready()) { - __f->__suspend_49_18.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 2; + __f->__suspend_49_18.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } @@ -194,8 +194,8 @@ void __fooResume(__fooFrame * __f) /* co_await Issue628.cpp:46 */ __f->__suspend_46_6_1 = __f->__promise.final_suspend(); if(!__f->__suspend_46_6_1.await_ready()) { - __f->__suspend_46_6_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 3; + __f->__suspend_46_6_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } diff --git a/tests/Issue679.expect b/tests/Issue679.expect index d6cb3ba6..5cd40e59 100644 --- a/tests/Issue679.expect +++ b/tests/Issue679.expect @@ -147,8 +147,8 @@ void __GeneratorResume(__GeneratorFrame * __f) /* co_await Issue679.cpp:65 */ __f->__suspend_65_8 = __f->__promise.initial_suspend(); if(!__f->__suspend_65_8.await_ready()) { - __f->__suspend_65_8.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_65_8.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -159,8 +159,8 @@ void __GeneratorResume(__GeneratorFrame * __f) /* co_yield Issue679.cpp:67 */ __f->__suspend_67_5 = __f->__promise.yield_value("Hello "); if(!__f->__suspend_67_5.await_ready()) { - __f->__suspend_67_5.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 2; + __f->__suspend_67_5.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } @@ -170,8 +170,8 @@ void __GeneratorResume(__GeneratorFrame * __f) /* co_yield Issue679.cpp:68 */ __f->__suspend_68_5 = __f->__promise.yield_value("world"); if(!__f->__suspend_68_5.await_ready()) { - __f->__suspend_68_5.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 3; + __f->__suspend_68_5.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } @@ -181,8 +181,8 @@ void __GeneratorResume(__GeneratorFrame * __f) /* co_yield Issue679.cpp:69 */ __f->__suspend_69_5 = __f->__promise.yield_value("!"); if(!__f->__suspend_69_5.await_ready()) { - __f->__suspend_69_5.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 4; + __f->__suspend_69_5.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } @@ -204,8 +204,8 @@ void __GeneratorResume(__GeneratorFrame * __f) /* co_await Issue679.cpp:65 */ __f->__suspend_65_8_1 = __f->__promise.final_suspend(); if(!__f->__suspend_65_8_1.await_ready()) { - __f->__suspend_65_8_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 5; + __f->__suspend_65_8_1.await_suspend(std::coroutine_handle::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } diff --git a/tests/Issue726.expect b/tests/Issue726.expect index e450f24f..c74b5532 100644 --- a/tests/Issue726.expect +++ b/tests/Issue726.expect @@ -103,8 +103,8 @@ void __funcAResume(__funcAFrame * __f) /* co_await Issue726.cpp:34 */ __f->__suspend_34_3 = __f->__promise.initial_suspend(); if(!__f->__suspend_34_3.await_ready()) { - __f->__suspend_34_3.await_suspend(std::coroutine_handle

::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_34_3.await_suspend(std::coroutine_handle

::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -132,8 +132,8 @@ void __funcAResume(__funcAFrame * __f) /* co_await Issue726.cpp:34 */ __f->__suspend_34_3_1 = __f->__promise.final_suspend(); if(!__f->__suspend_34_3_1.await_ready()) { - __f->__suspend_34_3_1.await_suspend(std::coroutine_handle

::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 2; + __f->__suspend_34_3_1.await_suspend(std::coroutine_handle

::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } diff --git a/tests/Issue727.cpp b/tests/Issue727.cpp new file mode 100644 index 00000000..b5b3a830 --- /dev/null +++ b/tests/Issue727.cpp @@ -0,0 +1,47 @@ +// cmdline:-std=c++20 +// cmdlineinsights:-edu-show-coroutine-transformation + +#include +#include +#include +struct P { + std::suspend_always initial_suspend() + { + return {}; + } + void return_void() const noexcept + { + std::cout<<"return_void()\n"; + } + std::coroutine_handle<> get_return_object() + { + return std::coroutine_handle

::from_promise(*this); + }; + void unhandled_exception() { throw; } + std::suspend_never final_suspend() noexcept + { + return {}; + } +}; +struct R { + R( + std::coroutine_handle<> d) noexcept + : data(d) + { + } + std::coroutine_handle<> data; + using promise_type = P; +}; +struct stupid_noop:std::suspend_always{ + void await_suspend(std::coroutine_handle<> h)const{ + h.resume(); + } +}; +R funcA(){ + co_await stupid_noop{}; +} +int main() +{ + funcA().data.resume(); + return 0; +} diff --git a/tests/Issue727.expect b/tests/Issue727.expect new file mode 100644 index 00000000..422640fe --- /dev/null +++ b/tests/Issue727.expect @@ -0,0 +1,183 @@ +/************************************************************************************* + * NOTE: The coroutine transformation you've enabled is a hand coded transformation! * + * Most of it is _not_ present in the AST. What you see is an approximation. * + *************************************************************************************/ +#include +#include +#include +struct P +{ + inline std::suspend_always initial_suspend() + { + return {}; + } + + inline void return_void() const noexcept + { + std::operator<<(std::cout, "return_void()\n"); + } + + inline std::coroutine_handle get_return_object() + { + return std::coroutine_handle

::from_promise(*this).operator std::coroutine_handle(); + } + + inline void unhandled_exception() + { + throw ; + } + + inline std::suspend_never final_suspend() noexcept + { + return {}; + } + + // inline constexpr P() noexcept = default; +}; + + +struct R +{ + inline R(std::coroutine_handle d) noexcept + : data{std::coroutine_handle(d)} + { + } + + std::coroutine_handle data; + using promise_type = P; +}; + + +struct stupid_noop : public std::suspend_always +{ + inline void await_suspend(std::coroutine_handle h) const + { + h.resume(); + } + +}; + + +struct __funcAFrame +{ + void (*resume_fn)(__funcAFrame *); + void (*destroy_fn)(__funcAFrame *); + std::__coroutine_traits_sfinae::promise_type __promise; + int __suspend_index; + bool __initial_await_suspend_called; + std::suspend_always __suspend_40_3; + stupid_noop __suspend_41_12; + std::suspend_never __suspend_40_3_1; +}; + +R funcA() +{ + /* Allocate the frame including the promise */ + /* Note: The actual parameter new is __builtin_coro_size */ + __funcAFrame * __f = reinterpret_cast<__funcAFrame *>(operator new(sizeof(__funcAFrame))); + __f->__suspend_index = 0; + __f->__initial_await_suspend_called = false; + + /* Construct the promise. */ + new (&__f->__promise)std::__coroutine_traits_sfinae::promise_type{}; + + /* Forward declare the resume and destroy function. */ + void __funcAResume(__funcAFrame * __f); + void __funcADestroy(__funcAFrame * __f); + + /* Assign the resume and destroy function pointers. */ + __f->resume_fn = &__funcAResume; + __f->destroy_fn = &__funcADestroy; + + /* Call the made up function with the coroutine body for initial suspend. + This function will be called subsequently by coroutine_handle<>::resume() + which calls __builtin_coro_resume(__handle_) */ + __funcAResume(__f); + + + std::coroutine_handle __coro_gro = __f->__promise.get_return_object(); + return R(std::coroutine_handle(static_cast &&>(__coro_gro))); +} + +/* This function invoked by coroutine_handle<>::resume() */ +void __funcAResume(__funcAFrame * __f) +{ + try + { + /* Create a switch to get to the correct resume point */ + switch(__f->__suspend_index) { + case 0: break; + case 1: goto __resume_funcA_1; + case 2: goto __resume_funcA_2; + case 3: goto __resume_funcA_3; + } + + /* co_await Issue727.cpp:40 */ + __f->__suspend_40_3 = __f->__promise.initial_suspend(); + if(!__f->__suspend_40_3.await_ready()) { + __f->__suspend_index = 1; + __f->__suspend_40_3.await_suspend(std::coroutine_handle

::from_address(static_cast(__f)).operator std::coroutine_handle()); + __f->__initial_await_suspend_called = true; + return; + } + + __resume_funcA_1: + __f->__suspend_40_3.await_resume(); + + /* co_await Issue727.cpp:41 */ + __f->__suspend_41_12 = stupid_noop{{}}; + if(!__f->__suspend_41_12.await_ready()) { + try + { + __f->__suspend_index = 2; + __f->__suspend_41_12.await_suspend(std::coroutine_handle

::from_address(static_cast(__f)).operator std::coroutine_handle()); + } catch(...) { + __f->__suspend_index = 1; + throw ; + } + return; + } + + __resume_funcA_2: + __f->__suspend_41_12.await_resume(); + /* co_return Issue727.cpp:40 */ + __f->__promise.return_void()/* implicit */; + goto __final_suspend; + } catch(...) { + if(!__f->__initial_await_suspend_called) { + throw ; + } + + __f->__promise.unhandled_exception(); + } + + __final_suspend: + + /* co_await Issue727.cpp:40 */ + __f->__suspend_40_3_1 = __f->__promise.final_suspend(); + if(!__f->__suspend_40_3_1.await_ready()) { + __f->__suspend_index = 3; + __f->__suspend_40_3_1.await_suspend(std::coroutine_handle

::from_address(static_cast(__f)).operator std::coroutine_handle()); + return; + } + + __resume_funcA_3: + __f->destroy_fn(__f); +} + +/* This function invoked by coroutine_handle<>::destroy() */ +void __funcADestroy(__funcAFrame * __f) +{ + /* destroy all variables with dtors */ + __f->~__funcAFrame(); + /* Deallocating the coroutine frame */ + /* Note: The actual argument to delete is __builtin_coro_frame with the promise as parameter */ + operator delete(static_cast(__f), sizeof(__funcAFrame)); +} + + +int main() +{ + static_cast &&>(funcA().data).resume(); + return 0; +} diff --git a/tests/Issue727_2.cpp b/tests/Issue727_2.cpp new file mode 100644 index 00000000..1b8d4b4f --- /dev/null +++ b/tests/Issue727_2.cpp @@ -0,0 +1,53 @@ +// cmdline:-std=c++20 +// cmdlineinsights:-edu-show-coroutine-transformation + +#include +#include +#include + +struct astupid_noop:std::suspend_always{ + void await_suspend(std::coroutine_handle<> h)const{ + } +}; + +struct P { + astupid_noop initial_suspend() + { + return {}; + } + void return_void() const noexcept + { + std::cout<<"return_void()\n"; + } + std::coroutine_handle<> get_return_object() + { + return std::coroutine_handle

::from_promise(*this); + }; + void unhandled_exception() { throw; } + std::suspend_never final_suspend() noexcept + { + return {}; + } +}; +struct R { + R( + std::coroutine_handle<> d) noexcept + : data(d) + { + } + std::coroutine_handle<> data; + using promise_type = P; +}; +struct stupid_noop:std::suspend_always{ + void await_suspend(std::coroutine_handle<> h)const{ + h.resume(); + } +}; +R funcA(){ + co_await stupid_noop{}; +} +int main() +{ + funcA().data.resume(); + return 0; +} diff --git a/tests/Issue727_2.expect b/tests/Issue727_2.expect new file mode 100644 index 00000000..aeeb506b --- /dev/null +++ b/tests/Issue727_2.expect @@ -0,0 +1,199 @@ +/************************************************************************************* + * NOTE: The coroutine transformation you've enabled is a hand coded transformation! * + * Most of it is _not_ present in the AST. What you see is an approximation. * + *************************************************************************************/ +#include +#include +#include + +struct astupid_noop : public std::suspend_always +{ + inline void await_suspend(std::coroutine_handle h) const + { + } + +}; + + +struct P +{ + inline astupid_noop initial_suspend() + { + return {{}}; + } + + inline void return_void() const noexcept + { + std::operator<<(std::cout, "return_void()\n"); + } + + inline std::coroutine_handle get_return_object() + { + return std::coroutine_handle

::from_promise(*this).operator std::coroutine_handle(); + } + + inline void unhandled_exception() + { + throw ; + } + + inline std::suspend_never final_suspend() noexcept + { + return {}; + } + + // inline constexpr P() noexcept = default; +}; + + +struct R +{ + inline R(std::coroutine_handle d) noexcept + : data{std::coroutine_handle(d)} + { + } + + std::coroutine_handle data; + using promise_type = P; +}; + + +struct stupid_noop : public std::suspend_always +{ + inline void await_suspend(std::coroutine_handle h) const + { + h.resume(); + } + +}; + + +struct __funcAFrame +{ + void (*resume_fn)(__funcAFrame *); + void (*destroy_fn)(__funcAFrame *); + std::__coroutine_traits_sfinae::promise_type __promise; + int __suspend_index; + bool __initial_await_suspend_called; + astupid_noop __suspend_46_3; + stupid_noop __suspend_47_12; + std::suspend_never __suspend_46_3_1; +}; + +R funcA() +{ + /* Allocate the frame including the promise */ + /* Note: The actual parameter new is __builtin_coro_size */ + __funcAFrame * __f = reinterpret_cast<__funcAFrame *>(operator new(sizeof(__funcAFrame))); + __f->__suspend_index = 0; + __f->__initial_await_suspend_called = false; + + /* Construct the promise. */ + new (&__f->__promise)std::__coroutine_traits_sfinae::promise_type{}; + + /* Forward declare the resume and destroy function. */ + void __funcAResume(__funcAFrame * __f); + void __funcADestroy(__funcAFrame * __f); + + /* Assign the resume and destroy function pointers. */ + __f->resume_fn = &__funcAResume; + __f->destroy_fn = &__funcADestroy; + + /* Call the made up function with the coroutine body for initial suspend. + This function will be called subsequently by coroutine_handle<>::resume() + which calls __builtin_coro_resume(__handle_) */ + __funcAResume(__f); + + + std::coroutine_handle __coro_gro = __f->__promise.get_return_object(); + return R(std::coroutine_handle(static_cast &&>(__coro_gro))); +} + +/* This function invoked by coroutine_handle<>::resume() */ +void __funcAResume(__funcAFrame * __f) +{ + try + { + /* Create a switch to get to the correct resume point */ + switch(__f->__suspend_index) { + case 0: break; + case 1: goto __resume_funcA_1; + case 2: goto __resume_funcA_2; + case 3: goto __resume_funcA_3; + } + + /* co_await Issue727_2.cpp:46 */ + __f->__suspend_46_3 = __f->__promise.initial_suspend(); + if(!__f->__suspend_46_3.await_ready()) { + try + { + __f->__suspend_index = 1; + __f->__suspend_46_3.await_suspend(std::coroutine_handle

::from_address(static_cast(__f)).operator std::coroutine_handle()); + } catch(...) { + __f->__suspend_index = 0; + throw ; + } + __f->__initial_await_suspend_called = true; + return; + } + + __resume_funcA_1: + __f->__suspend_46_3.await_resume(); + + /* co_await Issue727_2.cpp:47 */ + __f->__suspend_47_12 = stupid_noop{{}}; + if(!__f->__suspend_47_12.await_ready()) { + try + { + __f->__suspend_index = 2; + __f->__suspend_47_12.await_suspend(std::coroutine_handle

::from_address(static_cast(__f)).operator std::coroutine_handle()); + } catch(...) { + __f->__suspend_index = 1; + throw ; + } + return; + } + + __resume_funcA_2: + __f->__suspend_47_12.await_resume(); + /* co_return Issue727_2.cpp:46 */ + __f->__promise.return_void()/* implicit */; + goto __final_suspend; + } catch(...) { + if(!__f->__initial_await_suspend_called) { + throw ; + } + + __f->__promise.unhandled_exception(); + } + + __final_suspend: + + /* co_await Issue727_2.cpp:46 */ + __f->__suspend_46_3_1 = __f->__promise.final_suspend(); + if(!__f->__suspend_46_3_1.await_ready()) { + __f->__suspend_index = 3; + __f->__suspend_46_3_1.await_suspend(std::coroutine_handle

::from_address(static_cast(__f)).operator std::coroutine_handle()); + return; + } + + __resume_funcA_3: + __f->destroy_fn(__f); +} + +/* This function invoked by coroutine_handle<>::destroy() */ +void __funcADestroy(__funcAFrame * __f) +{ + /* destroy all variables with dtors */ + __f->~__funcAFrame(); + /* Deallocating the coroutine frame */ + /* Note: The actual argument to delete is __builtin_coro_frame with the promise as parameter */ + operator delete(static_cast(__f), sizeof(__funcAFrame)); +} + + +int main() +{ + static_cast &&>(funcA().data).resume(); + return 0; +} diff --git a/tests/Issue727_3.cpp b/tests/Issue727_3.cpp new file mode 100644 index 00000000..5ef504ac --- /dev/null +++ b/tests/Issue727_3.cpp @@ -0,0 +1,47 @@ +// cmdline:-std=c++20 +// cmdlineinsights:-edu-show-coroutine-transformation + +#include +#include +#include +struct P { + std::suspend_always initial_suspend() + { + return {}; + } + void return_void() const noexcept + { + std::cout<<"return_void()\n"; + } + std::coroutine_handle<> get_return_object() + { + return std::coroutine_handle

::from_promise(*this); + }; + void unhandled_exception() { throw; } + std::suspend_never final_suspend() noexcept + { + return {}; + } +}; +struct R { + R( + std::coroutine_handle<> d) noexcept + : data(d) + { + } + std::coroutine_handle<> data; + using promise_type = P; +}; +struct stupid_noop:std::suspend_always{ + bool await_suspend(std::coroutine_handle<> h)const{ + h.resume(); + return true; + } +}; +R funcA(){ + co_await stupid_noop{}; +} +int main() +{ + funcA().data.resume(); +} diff --git a/tests/Issue727_3.expect b/tests/Issue727_3.expect new file mode 100644 index 00000000..1dcf7352 --- /dev/null +++ b/tests/Issue727_3.expect @@ -0,0 +1,186 @@ +/************************************************************************************* + * NOTE: The coroutine transformation you've enabled is a hand coded transformation! * + * Most of it is _not_ present in the AST. What you see is an approximation. * + *************************************************************************************/ +#include +#include +#include +struct P +{ + inline std::suspend_always initial_suspend() + { + return {}; + } + + inline void return_void() const noexcept + { + std::operator<<(std::cout, "return_void()\n"); + } + + inline std::coroutine_handle get_return_object() + { + return std::coroutine_handle

::from_promise(*this).operator std::coroutine_handle(); + } + + inline void unhandled_exception() + { + throw ; + } + + inline std::suspend_never final_suspend() noexcept + { + return {}; + } + + // inline constexpr P() noexcept = default; +}; + + +struct R +{ + inline R(std::coroutine_handle d) noexcept + : data{std::coroutine_handle(d)} + { + } + + std::coroutine_handle data; + using promise_type = P; +}; + + +struct stupid_noop : public std::suspend_always +{ + inline bool await_suspend(std::coroutine_handle h) const + { + h.resume(); + return true; + } + +}; + + +struct __funcAFrame +{ + void (*resume_fn)(__funcAFrame *); + void (*destroy_fn)(__funcAFrame *); + std::__coroutine_traits_sfinae::promise_type __promise; + int __suspend_index; + bool __initial_await_suspend_called; + std::suspend_always __suspend_41_3; + stupid_noop __suspend_42_12; + std::suspend_never __suspend_41_3_1; +}; + +R funcA() +{ + /* Allocate the frame including the promise */ + /* Note: The actual parameter new is __builtin_coro_size */ + __funcAFrame * __f = reinterpret_cast<__funcAFrame *>(operator new(sizeof(__funcAFrame))); + __f->__suspend_index = 0; + __f->__initial_await_suspend_called = false; + + /* Construct the promise. */ + new (&__f->__promise)std::__coroutine_traits_sfinae::promise_type{}; + + /* Forward declare the resume and destroy function. */ + void __funcAResume(__funcAFrame * __f); + void __funcADestroy(__funcAFrame * __f); + + /* Assign the resume and destroy function pointers. */ + __f->resume_fn = &__funcAResume; + __f->destroy_fn = &__funcADestroy; + + /* Call the made up function with the coroutine body for initial suspend. + This function will be called subsequently by coroutine_handle<>::resume() + which calls __builtin_coro_resume(__handle_) */ + __funcAResume(__f); + + + std::coroutine_handle __coro_gro = __f->__promise.get_return_object(); + return R(std::coroutine_handle(static_cast &&>(__coro_gro))); +} + +/* This function invoked by coroutine_handle<>::resume() */ +void __funcAResume(__funcAFrame * __f) +{ + try + { + /* Create a switch to get to the correct resume point */ + switch(__f->__suspend_index) { + case 0: break; + case 1: goto __resume_funcA_1; + case 2: goto __resume_funcA_2; + case 3: goto __resume_funcA_3; + } + + /* co_await Issue727_3.cpp:41 */ + __f->__suspend_41_3 = __f->__promise.initial_suspend(); + if(!__f->__suspend_41_3.await_ready()) { + __f->__suspend_index = 1; + __f->__suspend_41_3.await_suspend(std::coroutine_handle

::from_address(static_cast(__f)).operator std::coroutine_handle()); + __f->__initial_await_suspend_called = true; + return; + } + + __resume_funcA_1: + __f->__suspend_41_3.await_resume(); + + /* co_await Issue727_3.cpp:42 */ + __f->__suspend_42_12 = stupid_noop{{}}; + if(!__f->__suspend_42_12.await_ready()) { + try + { + __f->__suspend_index = 2; + if(__f->__suspend_42_12.await_suspend(std::coroutine_handle

::from_address(static_cast(__f)).operator std::coroutine_handle())) { + return; + } + + } catch(...) { + __f->__suspend_index = 1; + throw ; + } + } + + __resume_funcA_2: + __f->__suspend_42_12.await_resume(); + /* co_return Issue727_3.cpp:41 */ + __f->__promise.return_void()/* implicit */; + goto __final_suspend; + } catch(...) { + if(!__f->__initial_await_suspend_called) { + throw ; + } + + __f->__promise.unhandled_exception(); + } + + __final_suspend: + + /* co_await Issue727_3.cpp:41 */ + __f->__suspend_41_3_1 = __f->__promise.final_suspend(); + if(!__f->__suspend_41_3_1.await_ready()) { + __f->__suspend_index = 3; + __f->__suspend_41_3_1.await_suspend(std::coroutine_handle

::from_address(static_cast(__f)).operator std::coroutine_handle()); + return; + } + + __resume_funcA_3: + __f->destroy_fn(__f); +} + +/* This function invoked by coroutine_handle<>::destroy() */ +void __funcADestroy(__funcAFrame * __f) +{ + /* destroy all variables with dtors */ + __f->~__funcAFrame(); + /* Deallocating the coroutine frame */ + /* Note: The actual argument to delete is __builtin_coro_frame with the promise as parameter */ + operator delete(static_cast(__f), sizeof(__funcAFrame)); +} + + +int main() +{ + static_cast &&>(funcA().data).resume(); + return 0; +} diff --git a/tests/Issue728.expect b/tests/Issue728.expect index d467263e..4ae14fc1 100644 --- a/tests/Issue728.expect +++ b/tests/Issue728.expect @@ -105,8 +105,8 @@ void __funcAResume(__funcAFrame * __f) /* co_await Issue728.cpp:35 */ __f->__suspend_35_3 = __f->__promise.initial_suspend(); if(!__f->__suspend_35_3.await_ready()) { - __f->__suspend_35_3.await_suspend(std::coroutine_handle

::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 1; + __f->__suspend_35_3.await_suspend(std::coroutine_handle

::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__initial_await_suspend_called = true; return; } @@ -117,8 +117,8 @@ void __funcAResume(__funcAFrame * __f) /* co_await Issue728.cpp:36 */ __f->__suspend_36_12 = std::suspend_never{}; if(!__f->__suspend_36_12.await_ready()) { - __f->__suspend_36_12.await_suspend(std::coroutine_handle

::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 2; + __f->__suspend_36_12.await_suspend(std::coroutine_handle

::from_address(static_cast(__f)).operator std::coroutine_handle()); return; } @@ -140,8 +140,8 @@ void __funcAResume(__funcAFrame * __f) /* co_await Issue728.cpp:35 */ __f->__suspend_35_3_1 = __f->__promise.final_suspend(); if(!__f->__suspend_35_3_1.await_ready()) { - __f->__suspend_35_3_1.await_suspend(std::coroutine_handle

::from_address(static_cast(__f)).operator std::coroutine_handle()); __f->__suspend_index = 3; + __f->__suspend_35_3_1.await_suspend(std::coroutine_handle

::from_address(static_cast(__f)).operator std::coroutine_handle()); return; }