================
@@ -7196,6 +7196,9 @@ bool Compiler<Emitter>::visitBreakStmt(const BreakStmt 
*S) {
       }
     }
   } else {
+    const Stmt *TargetLoop = S->getNamedLoopOrSwitch();
+    assert(TargetLoop && "break target label not available");
----------------
Sirraide wrote:

So I think there’s still an issue here.

In `ExprConstant.cpp` we just treat it as unlabeled if we can’t find the label, 
whereas here we just assert. I think we need to fail evaluation instead in both 
cases if the `LabelDecl` can’t be retrieved doesn’t exist yet—because then the 
branch target is almost certainly not within the current evaluation. I’d 
imagine the error could be something like ‘cannot break/continue to label '%0' 
that is not inside the current evaluation context’ or however we typically 
phrase that.

Can you see what happens if you write:
```c++
void f() {
    foo: for (;;) {
        static constexpr int x = ({
            for (;;) break foo;
            42;
        });
    }
}
```
Here, after this patch, I believe `ExprConstant.cpp` will erroneously treat the 
`break` as unlabeled, and I don’t know what the interpreter will do.

>From what I can tell, in all of your test cases, there isn’t actually a loop 
>inside the evaluated expression, so evaluation fails because it can’t find an 
>enclosing loop, not because the `break` is invalid

https://github.com/llvm/llvm-project/pull/228655
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to