[clang] [LifetimeSafety] Fix crash on ternary operator when one of the expressions is `throw` (PR #190345)

Gábor Horváth via cfe-commits cfe-commits at lists.llvm.org
Wed Apr 8 01:00:13 PDT 2026


================
@@ -400,12 +401,58 @@ void FactsGenerator::VisitBinaryOperator(const BinaryOperator *BO) {
   // TODO: Handle assignments involving dereference like `*p = q`.
 }
 
+void FactsGenerator::handleTernaryOperator(const ConditionalOperator *CO) {
+  const Expr *TrueExpr = CO->getTrueExpr();
+  const Expr *FalseExpr = CO->getFalseExpr();
+
+  const auto Preds = CurrentBlock->preds();
+  auto PredHasStmt = [](const CFGBlock::AdjacentBlock &Pred, const Stmt *S) {
+    return llvm::any_of(*Pred, [S](const CFGElement &Elt) {
+      if (auto CS = Elt.getAs<CFGStmt>()) {
+        return CS->getStmt() == S;
+      }
+      return false;
+    });
+  };
+
+  bool TBHasEdge = true;
+  bool FBHasEdge = true;
+
+  switch (CurrentBlock->pred_size()) {
+  case 0:
+    return;
+  case 1:
+    TBHasEdge = PredHasStmt(*Preds.begin(), TrueExpr->IgnoreParenImpCasts());
----------------
Xazax-hun wrote:

Instead of looking at the statements, would it be possible to get the corresponding Cfg nodes and compare the preds to the CFG nodes correspond to the true and false expression?

https://github.com/llvm/llvm-project/pull/190345


More information about the cfe-commits mailing list