Author: DonĂ¡t Nagy Date: 2026-02-06T13:27:12+01:00 New Revision: c09bb7bd4065c7f454a5f9df60a064f670a54871
URL: https://github.com/llvm/llvm-project/commit/c09bb7bd4065c7f454a5f9df60a064f670a54871 DIFF: https://github.com/llvm/llvm-project/commit/c09bb7bd4065c7f454a5f9df60a064f670a54871.diff LOG: [NFC][analyzer] Remove IndirectGotoNodeBuilder::iterator (#180167) My recent commit b96ef9c97bee44017bd832efab899ba1ed1f9b8f removed a needlessly overcomplicated iterator class from SwitchNodeBuilder; this commit repeats the same cleanup for IndirectGotoNodeBuilder. (This is just for the sake of consistency -- I don't have plans to work on indirect goto handling.) Added: Modified: clang/include/clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h clang/lib/StaticAnalyzer/Core/CoreEngine.cpp clang/lib/StaticAnalyzer/Core/ExprEngine.cpp Removed: ################################################################################ diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h index 7c1225d23daef..75a24827d3e03 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CoreEngine.h @@ -402,48 +402,25 @@ class BranchNodeBuilder: public NodeBuilder { }; class IndirectGotoNodeBuilder { - CoreEngine& Eng; + const CoreEngine &Eng; const CFGBlock *Src; const CFGBlock &DispatchBlock; const Expr *E; ExplodedNode *Pred; public: - IndirectGotoNodeBuilder(ExplodedNode *pred, const CFGBlock *src, - const Expr *e, const CFGBlock *dispatch, CoreEngine* eng) - : Eng(*eng), Src(src), DispatchBlock(*dispatch), E(e), Pred(pred) {} - - class iterator { - friend class IndirectGotoNodeBuilder; - - CFGBlock::const_succ_iterator I; - - iterator(CFGBlock::const_succ_iterator i) : I(i) {} + IndirectGotoNodeBuilder(ExplodedNode *Pred, const CFGBlock *Src, + const Expr *E, const CFGBlock *Dispatch, + const CoreEngine *Eng) + : Eng(*Eng), Src(Src), DispatchBlock(*Dispatch), E(E), Pred(Pred) {} - public: - // This isn't really a conventional iterator. - // We just implement the deref as a no-op for now to make range-based for - // loops work. - const iterator &operator*() const { return *this; } + using iterator = CFGBlock::const_succ_iterator; - iterator &operator++() { ++I; return *this; } - bool operator!=(const iterator &X) const { return I != X.I; } + iterator begin() { return DispatchBlock.succ_begin(); } + iterator end() { return DispatchBlock.succ_end(); } - const LabelDecl *getLabel() const { - return cast<LabelStmt>((*I)->getLabel())->getDecl(); - } - - const CFGBlock *getBlock() const { - return *I; - } - }; - - iterator begin() { return iterator(DispatchBlock.succ_begin()); } - iterator end() { return iterator(DispatchBlock.succ_end()); } - - ExplodedNode *generateNode(const iterator &I, - ProgramStateRef State, - bool isSink = false); + ExplodedNode *generateNode(const CFGBlock *Block, ProgramStateRef State, + bool IsSink = false); const Expr *getTarget() const { return E; } diff --git a/clang/lib/StaticAnalyzer/Core/CoreEngine.cpp b/clang/lib/StaticAnalyzer/Core/CoreEngine.cpp index 18a009abfb6a4..bfaa874f1632a 100644 --- a/clang/lib/StaticAnalyzer/Core/CoreEngine.cpp +++ b/clang/lib/StaticAnalyzer/Core/CoreEngine.cpp @@ -724,14 +724,12 @@ ExplodedNode *BranchNodeBuilder::generateNode(ProgramStateRef State, return Succ; } -ExplodedNode* -IndirectGotoNodeBuilder::generateNode(const iterator &I, - ProgramStateRef St, - bool IsSink) { +ExplodedNode *IndirectGotoNodeBuilder::generateNode(const CFGBlock *Block, + ProgramStateRef St, + bool IsSink) { bool IsNew; - ExplodedNode *Succ = - Eng.G.getNode(BlockEdge(Src, I.getBlock(), Pred->getLocationContext()), - St, IsSink, &IsNew); + ExplodedNode *Succ = Eng.G.getNode( + BlockEdge(Src, Block, Pred->getLocationContext()), St, IsSink, &IsNew); Succ->addPredecessor(Pred, Eng.G); if (!IsNew) diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp index a90b37cdf88d8..1249fe6423ccb 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -3001,13 +3001,11 @@ void ExprEngine::processIndirectGoto(IndirectGotoNodeBuilder &builder) { // (3) We have no clue about the label. Dispatch to all targets. // - using iterator = IndirectGotoNodeBuilder::iterator; - if (std::optional<loc::GotoLabel> LV = V.getAs<loc::GotoLabel>()) { const LabelDecl *L = LV->getLabel(); - for (iterator Succ : builder) { - if (Succ.getLabel() == L) { + for (const CFGBlock *Succ : builder) { + if (cast<LabelStmt>(Succ->getLabel())->getDecl() == L) { builder.generateNode(Succ, state); return; } @@ -3027,7 +3025,7 @@ void ExprEngine::processIndirectGoto(IndirectGotoNodeBuilder &builder) { // This is really a catch-all. We don't support symbolics yet. // FIXME: Implement dispatch for symbolic pointers. - for (iterator Succ : builder) + for (const CFGBlock *Succ : builder) builder.generateNode(Succ, state); } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
