<div dir="ltr">These are indeed different things: IR "resume" is for continuing an existing in-progress unwind, while "throw;" (aka "call @__cxa_rethrow") starts a brand new unwind to find a new catch location -- just using the same exception object.<div><br></div><div>Thus, you can only use resume to continue on from an intermediate cleanup. Once you've entered a landingpad having a exception type matching the "catch" clause, you can no longer resume. See also <a href="https://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html">https://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html</a> -- noting that IR "resume" ends up as a call to "_Unwind_resume".</div><div><div><br></div><div>Yet, it seems unlikely that Clang is actually getting the above incorrect -- do you have a more complete test-case you think might be wrong?</div><div><br></div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Dec 1, 2021 at 2:36 AM chuanqi.xcq via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)">Hi,</span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)"><br></span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)">   Recently I am checking the implementation of c++20 coroutine in clang and I am wondering if it is possible to mark its status as complete.</span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)">(Now the status is partial althought it's been a while that the clang's coroutine is used in production). </span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)">   </span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)">   Here is the simple introduction, in the standard: <a href="https://eel.is/c++draft/dcl.fct.def.coroutine#5" target="_blank">https://eel.is/c++draft/dcl.fct.def.coroutine#5</a>, it says both initial_suspend().await_ready() </span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)">and initial_suspend().await_suspend() should be wrapped in `try` statement  and if there is an exception happens, it would be rethown by </span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)">`throw;` statement. It may look like:</span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)"><br></span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)">```C++</span></div><div style="clear:both">try {</div><div style="clear:both">   auto init_suspend = promise.init_suspend();</div><div style="clear:both">   if (!init_suspend.await_ready())</div><div style="clear:both">        init_suspend.await_suspend();</div><div style="clear:both">} catch (...) {</div><div style="clear:both">    throw;</div><div style="clear:both">}</div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)">```</span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)"><br></span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)">    And the implementation didn't wrap them in `try...catch` statement. The code generated by clang would look like:</span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)"><br></span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)">```LLVM</span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)">invoke <span style="color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;background-color:rgb(255,255,255);text-decoration:none;float:none;display:inline">promise.init_suspend()</span></span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)"><span style="color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;background-color:rgb(255,255,255);text-decoration:none;float:none;display:inline">    to label %cont unwind label %lpad</span></span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)"></span><div style="margin:0px;padding:0px;border:0px;outline:0px;color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;background-color:rgb(255,255,255);text-decoration:none;clear:both"><span style="margin:0px;padding:0px;border:0px;outline:0px;font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)">invoke <span style="margin:0px;padding:0px;border:0px;outline:0px;color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;background-color:rgb(255,255,255);text-decoration:none;float:none;display:inline">init_suspend.await_ready()</span></span></div><div style="margin:0px;padding:0px;border:0px;outline:0px;color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;background-color:rgb(255,255,255);text-decoration:none;clear:both"><span style="margin:0px;padding:0px;border:0px;outline:0px;font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)"><span style="margin:0px;padding:0px;border:0px;outline:0px;color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;background-color:rgb(255,255,255);text-decoration:none;float:none;display:inline">    to label %cont1 unwind label %lpad1</span></span></div></div><div style="clear:both"><div style="margin:0px;padding:0px;border:0px;outline:0px;color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;background-color:rgb(255,255,255);text-decoration:none;clear:both"><span style="margin:0px;padding:0px;border:0px;outline:0px;font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)"></span></div><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)"><span style="color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;background-color:rgb(255,255,255);text-decoration:none;float:none;display:inline">invoke <span style="margin:0px;padding:0px;border:0px;outline:0px;color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;text-decoration:none;background-color:rgb(255,255,255);float:none;display:inline">init_suspend.await_suspend()</span></span></span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)"><span style="color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;background-color:rgb(255,255,255);text-decoration:none;float:none;display:inline"><span style="margin:0px;padding:0px;border:0px;outline:0px;color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;text-decoration:none;background-color:rgb(255,255,255);float:none;display:inline">    to label %cont2 unwind label %lpad2</span></span></span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)"><span style="color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;background-color:rgb(255,255,255);text-decoration:none;float:none;display:inline"><span style="margin:0px;padding:0px;border:0px;outline:0px;color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;text-decoration:none;background-color:rgb(255,255,255);float:none;display:inline">...</span></span></span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)"><span style="color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;background-color:rgb(255,255,255);text-decoration:none;float:none;display:inline"><span style="margin:0px;padding:0px;border:0px;outline:0px;color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;text-decoration:none;background-color:rgb(255,255,255);float:none;display:inline">%lpad:</span></span></span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)"><span style="color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;background-color:rgb(255,255,255);text-decoration:none;float:none;display:inline"><span style="margin:0px;padding:0px;border:0px;outline:0px;color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;text-decoration:none;background-color:rgb(255,255,255);float:none;display:inline">   ...</span></span></span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)"><span style="color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;background-color:rgb(255,255,255);text-decoration:none;float:none;display:inline"><span style="margin:0px;padding:0px;border:0px;outline:0px;color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;text-decoration:none;background-color:rgb(255,255,255);float:none;display:inline">   br label %eh.resume</span></span></span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)"><span style="color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;background-color:rgb(255,255,255);text-decoration:none;float:none;display:inline"><span style="margin:0px;padding:0px;border:0px;outline:0px;color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;text-decoration:none;background-color:rgb(255,255,255);float:none;display:inline">%lpad1:</span></span></span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)"><span style="color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;background-color:rgb(255,255,255);text-decoration:none;float:none;display:inline"><span style="margin:0px;padding:0px;border:0px;outline:0px;color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;text-decoration:none;background-color:rgb(255,255,255);float:none;display:inline">   ...</span></span></span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)"><span style="color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;background-color:rgb(255,255,255);text-decoration:none;float:none;display:inline"><span style="margin:0px;padding:0px;border:0px;outline:0px;color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;text-decoration:none;background-color:rgb(255,255,255);float:none;display:inline">   br label %eh.resume</span></span></span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)"><span style="color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;background-color:rgb(255,255,255);text-decoration:none;float:none;display:inline"><span style="margin:0px;padding:0px;border:0px;outline:0px;color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;text-decoration:none;background-color:rgb(255,255,255);float:none;display:inline"> %lpad2:</span></span></span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)"><span style="color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;background-color:rgb(255,255,255);text-decoration:none;float:none;display:inline"><span style="margin:0px;padding:0px;border:0px;outline:0px;color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;text-decoration:none;background-color:rgb(255,255,255);float:none;display:inline">   ...</span></span></span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)"><span style="color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;background-color:rgb(255,255,255);text-decoration:none;float:none;display:inline"><span style="margin:0px;padding:0px;border:0px;outline:0px;color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;text-decoration:none;background-color:rgb(255,255,255);float:none;display:inline">   br label %eh.resume</span></span></span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)"><span style="color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;background-color:rgb(255,255,255);text-decoration:none;float:none;display:inline"><span style="margin:0px;padding:0px;border:0px;outline:0px;color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;text-decoration:none;background-color:rgb(255,255,255);float:none;display:inline">eh.resume:</span></span></span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)"><span style="color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;background-color:rgb(255,255,255);text-decoration:none;float:none;display:inline"><span style="margin:0px;padding:0px;border:0px;outline:0px;color:rgb(0,0,0);font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;font-style:normal;font-variant-caps:normal;font-weight:normal;text-align:start;text-indent:0px;text-transform:none;text-decoration:none;background-color:rgb(255,255,255);float:none;display:inline">   ....</span></span></span></div><div style="clear:both">   resume</div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)">```</span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)"><br></span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)">   And I know that clang would generate `__cxa_rethrow` for `throw;`. I did some simple test locally, the behavior now looks </span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)">good for me. (I could catch the exception in the caller of the coroutine). </span><span style="font-size:14px">But I think it would be better to consult with the experts. </span></div><div style="clear:both"><span style="font-size:14px">I am wondering what's the difference and if it would be a block issue for conforming clang's implementation.</span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)"><br></span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)">Thanks,</span></div><div style="clear:both"><span style="font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14px;color:rgb(0,0,0)">Chuanqi</span></div></div>_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br>
</blockquote></div>