Index: clang/lib/StaticAnalyzer/Core/ExprEngine.cpp =================================================================== --- clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ clang/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -3029,22 +3029,16 @@ llvm::function_ref PreCallback, llvm::function_ref PostCallback, llvm::function_ref Stop) { - const ExplodedNode *FirstHiddenNode = N; - while (FirstHiddenNode->pred_size() == 1 && - isNodeHidden(*FirstHiddenNode->pred_begin())) { - FirstHiddenNode = *FirstHiddenNode->pred_begin(); - } - const ExplodedNode *OtherNode = FirstHiddenNode; while (true) { - PreCallback(OtherNode); - if (Stop(OtherNode)) + PreCallback(N); + if (Stop(N)) return true; - if (OtherNode == N) + if (N->succ_size() != 1 || !isNodeHidden(N->getFirstSucc())) break; - PostCallback(OtherNode); + PostCallback(N); - OtherNode = *OtherNode->succ_begin(); + N = N->getFirstSucc(); } return false; } Index: clang/test/Analysis/dump_egraph.c =================================================================== --- clang/test/Analysis/dump_egraph.c +++ clang/test/Analysis/dump_egraph.c @@ -18,10 +18,30 @@ return *x + *y; } -// CHECK: \"program_points\": [\l    \{ \"kind\": \"Edge\", \"src_id\": 2, \"dst_id\": 1, \"terminator\": null, \"term_kind\": null, \"tag\": null, \"node_id\": 1, \"is_sink\": 0, \"has_report\": 0 \}\l  ],\l  \"program_state\": null - -// CHECK: \"program_points\": [\l    \{ \"kind\": \"BlockEntrance\", \"block_id\": 1 - +// CHECK: \"program_points\": [\l +// CHECK-SAME: \{ \"kind\": \"Edge\", \"src_id\": 2, \"dst_id\": 1, +// CHECK-SAME: \"terminator\": null, \"term_kind\": null, \"tag\": null, +// CHECK-SAME: \"node_id\": 1, \"is_sink\": 0, \"has_report\": 0 +// CHECK-SAME: \}, +// CHECK-SAME: \{ \"kind\": \"BlockEntrance\", \"block_id\": 1, \"tag\": null, +// CHECK-SAME: \"node_id\": 2, \"is_sink\": 0, \"has_report\": 0 +// CHECK-SAME: \}, +// CHECK-SAME: \{ \"kind\": \"Statement\", \"stmt_kind\": \"IntegerLiteral\", +// CHECK-SAME: \"stmt_id\": 597, \"pointer\": \"0x{{[0-9a-f]*}}\", +// CHECK-SAME: \"pretty\": \"0\", \"location\": \{ +// CHECK-SAME: \"line\": 15, \"column\": 12, \"file\": \" +// CHECK-SAME: \}, \"stmt_point_kind\": \"PreStmtPurgeDeadSymbols\", +// CHECK-SAME: \"tag\": \"ExprEngine : Clean Node\", \"node_id\": 3, +// CHECK-SAME: \"is_sink\": 0, \"has_report\": 0 +// CHECK-SAME: \}, +// CHECK-SAME: \{ \"kind\": \"Statement\", \"stmt_kind\": \"IntegerLiteral\", +// CHECK-SAME: \"stmt_id\": 597, \"pointer\": \"0x{{[0-9a-f]*}}\", +// CHECK-SAME: \"pretty\": \"0\", \"location\": \{ +// CHECK-SAME: \"line\": 15, \"column\": 12, \"file\": +// CHECK-SAME: \}, \"stmt_point_kind\": \"PostStmt\", \"tag\": null, +// CHECK-SAME: \"node_id\": 4, \"is_sink\": 0, \"has_report\": 0 +// CHECK-SAME: \} +// CHECK-SAME: ] // CHECK: \"pretty\": \"*x\", \"location\": \{ \"line\": 18, \"column\": 10, \"file\": \"{{(.+)}}dump_egraph.c\" \}