[PATCH] D45860: [Coroutines] Catch exceptions in await_resume

Gor Nishanov via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Apr 25 12:11:15 PDT 2018


GorNishanov added a comment.

Thank you for doing this. It looks very elegant, but, it is a little bit wrong. It creates two different initial_suspend objects.
Run this example:

https://wandbox.org/permlink/Q1Zd2NUlolmw9YmX

You will observe that in trunk we are getting the output:

  0x216808c: constructed(initial)
  0x216808c: await_ready
  0x216808c: await_suspend
  0x216808c: await_resume
  0x216808c: destroyed
  0x21680b8: constructed(final)
  0x21680b8: await_ready
  0x21680b8: await_suspend
  consumed 10 values with sum 45
  0x21680b8: destroyed
  promise destroyed

With this change, the output becomes:

  0x1965c4c: constructed(initial)
  0x1965c4c: await_ready
  0x1965c4c: await_suspend
  0x1965c4c: destroyed
  0x1965c60: constructed(initial)
  0x1965c60: await_resume
  0x1965c60: destroyed
  0x1965c80: constructed(final)
  0x1965c80: await_ready
  0x1965c80: await_suspend
  consumed 10 values with sum 45
  0x1965c80: destroyed
  0x1965c60: destroyed
  promise destroyed

I suggest, first modify the unit test to check that we do not create two initial_suspend objects. Then to fix it :-)



================
Comment at: lib/CodeGen/CGCoroutine.cpp:595
 
+    auto InitSuspend = S.getInitSuspendStmt();
     CurCoro.Data->CurrentAwaitKind = AwaitKind::Init;
----------------
auto *InitialSuspend = ...

See: https://llvm.org/docs/CodingStandards.html#use-auto-type-deduction-to-make-code-more-readable



================
Comment at: lib/CodeGen/CGCoroutine.cpp:605
       auto Loc = S.getLocStart();
+      auto AwaitExpr =
+          cast<CoawaitExpr>(cast<ExprWithCleanups>(InitSuspend)->getSubExpr());
----------------
auto *AwaitExpr =


================
Comment at: lib/CodeGen/CGCoroutine.cpp:608
+
+      SmallVector<Stmt *, 2> Stmts;
+      Stmts.push_back(AwaitExpr->getResumeExpr());
----------------
Consider:
```
 std::array<Stmt *,2> Stmts = {AwaitExpr->getResumeExpr(), S.getBody()};
```
instead


Repository:
  rC Clang

https://reviews.llvm.org/D45860





More information about the cfe-commits mailing list