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