GorNishanov requested changes to this revision.
GorNishanov added inline comments.
This revision now requires changes to proceed.


================
Comment at: lib/Sema/SemaCoroutine.cpp:675
+  // Second emphasis of [expr.await]p2: must be outside of an exception 
handler.
+  if (S.getCurScope()->getFlags() & Scope::CatchScope) {
+    S.Diag(Loc, diag::err_coroutine_within_handler) << Keyword;
----------------
lewissbaker wrote:
> modocache wrote:
> > modocache wrote:
> > > lewissbaker wrote:
> > > > modocache wrote:
> > > > > EricWF wrote:
> > > > > > We can still build a valid AST after encountering this error, no?
> > > > > > 
> > > > > > 
> > > > > I believe so. Just to be clear: you'd like me to continue building 
> > > > > the AST even after emitting this error diagnostic? My understanding 
> > > > > is that most of this file bails soon after any error is encountered 
> > > > > (correct me if that's wrong). I'm happy to change that, but I wonder 
> > > > > if it'd be better to do that in a separate diff...?
> > > > Do the scope flags reset when a lambda occurs within a catch-block?
> > > > 
> > > > eg. The following should still be valid.
> > > > ```
> > > > try { ... }
> > > > catch (...) {
> > > >   []() -> task { co_await foo(); }();
> > > > }
> > > > ```
> > > I believe they're reset, the example you posted compiles fine with this 
> > > patch. I'll add a test case specifically for this and confirm exactly 
> > > where the scope flags are reset or ignored in the lambda case.
> > When the parser encounters a lambda, it takes the path 
> > `Parser::ParseLambdaExpression -> 
> > Parser::ParseLambdaExpressionAfterIntroducer -> 
> > Parser::ParseCompoundStatementBody`, which creates an inner scope for the 
> > body of the lambda. This inner scope does not have the `Scope::CatchScope` 
> > flag, so it doesn't result in the error.
> > 
> > Although, your question did make me realize that this compiles just fine, 
> > even with this patch:
> > 
> > ```
> > void example() {
> >   try {
> >     throw;
> >   } catch (...) {
> >     try {
> >       co_await a;
> >     }
> >   }
> > }
> > ```
> > 
> > But I believe this above case should also be treated as an error, right?
> Yes, I believe that co_await within a try-block within a catch-block should 
> not be allowed.
Yes. That will result in suspension of the coroutine and we don't yet know how 
to suspend in catch blocks.

Also, I agree with @EricWF, this error should not prevent us from continuing 
semantic analysis with the rest of the function body.


Repository:
  rC Clang

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D59076/new/

https://reviews.llvm.org/D59076



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to