llvm / clangir

A new (MLIR based) high-level IR for clang.
https://clangir.org
Other
384 stars 100 forks source link

Assertion failure on switch statement with code outside a case #521

Open dkolsen-pgi opened 7 months ago

dkolsen-pgi commented 7 months ago

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.

smeenai commented 2 months ago

Note that code outside a case isn't necessarily dead, because you can do things like https://godbolt.org/z/PqEGzKEzb to reach it.