clangir
clangir copied to clipboard
Assertion failure on switch statement with code outside a case
ClangIR hits an assertion failure when a switch statement contains code that is not covered by a case label.
int f(int x) {
switch (x) {
return 0; // Dead code
case 1:
return -1;
}
return x;
}
clang++: .../clang/lib/CIR/CodeGen/CIRGenStmt.cpp:974:
cir::CIRGenFunction::buildSwitchStmt(const clang::SwitchStmt&)::<lambda()>::<lambda(mlir::OpBuilder&, mlir::Location, mlir::OperationState&)>:
Assertion `lastCaseBlock && "expects pre-existing case block"' failed.
While code like this should never appear in production and will only ever be found in test suites that try to break the compiler, it is legal code in both C and C++ and should not trigger an internal compiler error.
Note that code outside a case isn't necessarily dead, because you can do things like https://godbolt.org/z/PqEGzKEzb to reach it.