================
@@ -3371,6 +3379,20 @@ Sema::ActOnBreakStmt(SourceLocation BreakLoc, Scope 
*CurScope) {
   if (S->isOpenMPLoopScope())
     return StmtError(Diag(BreakLoc, diag::err_omp_loop_cannot_use_stmt)
                      << "break");
+
+  // OpenACC doesn't allow 'break'ing from a compute construct, so diagnose if
+  // we are trying to do so.  This can come in 2 flavors: 1-the break'able 
thing
+  // (besides the compute construct) 'contains' the compute construct, at which
+  // point the 'break' scope will be the compute construct.  Else it could be a
+  // loop of some sort that has a direct parent of the compute construct.
+  // However, a 'break' in a 'switch' marked as a compute construct doesn't
+  // count as 'branch out of' the compute construct.
+  if (S->isOpenACCComputeConstructScope() ||
+      (!S->isDirectlySwitchScope() && S->getParent() &&
----------------
erichkeane wrote:

>What is "ignorability"? Sorry, just asking to understand the context more 
>correctly.

The idea is that we should be able to 'ignore' the pragmas and have the program 
still have meaning.  A big part of the 'theory' here is that you should be able 
to add pragmas to existing code and get 'descriptive' messages that show what 
you did wrong, and a pragma introducing a scope isnt really 'true' (so having 
it observably act as a scope seems wrong).

>These constructs, if enabled, should be pretty similar to lambdas, so I assume 
>it should be fine to diagnose dangling break/continue here. The diagnostics 
>might be improved, though.

I think the difference is that the lambda introduces a lookup scope/etc, 
whereas these pragmas aren't supposed to.  For example, setting the 'function' 
scope prevents something like:

```
auto foo(int i) {
#pragma acc parallel
int j = function_call();

return i + j;
}
```
from working. See : https://godbolt.org/z/Gq8Yen1vr (for the omp example).

This is actually something that is supposed to work in OpenACC, so introducing 
the scope makes that not work.

https://github.com/llvm/llvm-project/pull/82543
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to