================
@@ -401,12 +402,58 @@ void FactsGenerator::VisitBinaryOperator(const
BinaryOperator *BO) {
}
void FactsGenerator::VisitConditionalOperator(const ConditionalOperator *CO) {
- if (hasOrigins(CO)) {
- // Merge origins from both branches of the conditional operator.
- // We kill to clear the initial state and merge both origins into it.
- killAndFlowOrigin(*CO, *CO->getTrueExpr());
- flowOrigin(*CO, *CO->getFalseExpr());
+ if (!hasOrigins(CO))
+ return;
+
+ const Expr *TrueExpr = CO->getTrueExpr();
+ const Expr *FalseExpr = CO->getFalseExpr();
+
+ const auto Preds = CurrentBlock->preds();
+
+ // Skip origin flow from conditional operator arms that cannot produce the
+ // result value: throw arms and calls to noreturn functions.
+ bool TBHasEdge = true;
+ bool FBHasEdge = true;
+
+ switch (CurrentBlock->pred_size()) {
+ case 0:
+ return;
+ case 1: {
+ TBHasEdge = llvm::any_of(**Preds.begin(),
+ [ExpectedStmt = TrueExpr->IgnoreParenImpCasts()](
+ const CFGElement &Elt) {
+ if (auto CS = Elt.getAs<CFGStmt>())
+ return CS->getStmt() == ExpectedStmt;
+ return false;
+ });
----------------
NeKon69 wrote:
Formatting is a bit weird after I inlined the lambda, but it's fine, I guess?
https://github.com/llvm/llvm-project/pull/190345
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits