https://github.com/spavloff created https://github.com/llvm/llvm-project/pull/150582
When searching for noreturn variable initializations, do not visit CFG blocks that are already visited, it prevents hanging the analysis. It must fix Ihttps://github.com/llvm/llvm-project/issues/150336. >From c63685694e0d2ffb7599006aa08c6032eafd2edb Mon Sep 17 00:00:00 2001 From: Serge Pavlov <sepavl...@gmail.com> Date: Fri, 25 Jul 2025 13:35:19 +0700 Subject: [PATCH] [Analysis] Prevent revisiting block when searching for noreturn vars When searching for noreturn variable initializations, do not visit CFG blocks that are already visited, it prevents hanging the analysis. It must fix Ihttps://github.com/llvm/llvm-project/issues/150336. --- clang/lib/Sema/AnalysisBasedWarnings.cpp | 4 ++++ clang/test/SemaCXX/noreturn-vars.cpp | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/clang/lib/Sema/AnalysisBasedWarnings.cpp b/clang/lib/Sema/AnalysisBasedWarnings.cpp index 829c81bab16f5..35ad0b59ad0fc 100644 --- a/clang/lib/Sema/AnalysisBasedWarnings.cpp +++ b/clang/lib/Sema/AnalysisBasedWarnings.cpp @@ -503,8 +503,12 @@ static bool areAllValuesNoReturn(const VarDecl *VD, const CFGBlock &VarBlk, TransferFunctions TF(VD); BackwardDataflowWorklist Worklist(*AC.getCFG(), AC); + llvm::DenseSet<const CFGBlock *> Visited; Worklist.enqueueBlock(&VarBlk); while (const CFGBlock *B = Worklist.dequeue()) { + if (Visited.contains(B)) + continue; + Visited.insert(B); // First check the current block. for (CFGBlock::const_reverse_iterator ri = B->rbegin(), re = B->rend(); ri != re; ++ri) { diff --git a/clang/test/SemaCXX/noreturn-vars.cpp b/clang/test/SemaCXX/noreturn-vars.cpp index ca65fcf5ca31d..1bf074149f04c 100644 --- a/clang/test/SemaCXX/noreturn-vars.cpp +++ b/clang/test/SemaCXX/noreturn-vars.cpp @@ -225,3 +225,20 @@ extern void abc_02(func_type *); abc_02(&func_ptr); func_ptr(); } // expected-warning {{function declared 'noreturn' should not return}} + +namespace Issue150336 { +void free(void *); +typedef void (*sel_freefunc)(void *); +struct gmx_ana_selmethod_t { + sel_freefunc free; + int nparams; + int *param; +}; +void gmx_selelem_free_method(struct gmx_ana_selmethod_t* method, void* mdata) { + sel_freefunc free_func = 0; + for (int i = 0; i < method->nparams; ++i) + free(&method->param[i]); + if (mdata && free_func) + free_func(mdata); +} +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits