llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Serge Pavlov (spavloff) <details> <summary>Changes</summary> 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. --- Full diff: https://github.com/llvm/llvm-project/pull/150582.diff 2 Files Affected: - (modified) clang/lib/Sema/AnalysisBasedWarnings.cpp (+4) - (modified) clang/test/SemaCXX/noreturn-vars.cpp (+17) ``````````diff 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); +} +} `````````` </details> https://github.com/llvm/llvm-project/pull/150582 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits