================
@@ -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:

This is covering 2 separate cases.

First:


```
switch(F) { <-- Switch scope
case 1:
#pragma acc parallel <-- compute-construct scope
break;
}
```
In this case, this is the pre-'||' check, the pragma's scope itself (created in 
ParseOpenACC.cpp) will be the 'break parent' of current, which cannot be broken 
from (so it is diagnosed).  This can NEVER be a 'switch' scope, as it is a 
'pragma acc compute-construct' scope.

Second:

```
#pragma acc parallel <-- compute construct scope
switch(F) { <-- switch scope
case 1:
break;
}
```
This is how the OpenMP variant of this diagnostic works, the 'scope' here is 
the 'switch scope'.  Additionally, the 'parent' of this one is the Compute 
Construct scope.  So everything after the '||' handles this. (note that 
`isOpenMPLoopScope` handles this by implicitly checking the 'parent').  Since 
we have the 'switch' scope (or other loop/scope/etc), we have to check that it 
is directly inside of the pragma scope.  Since this one CAN be a 'switch'/any 
other loop/scope/etc, we have to check it, as well as checking the 'parent' for 
being an OpenACC Compute construct.


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