https://github.com/spavloff updated https://github.com/llvm/llvm-project/pull/150582
>From 2a480a3b72567791218e632a6849280346e74acb Mon Sep 17 00:00:00 2001 From: Serge Pavlov <sepavl...@gmail.com> Date: Fri, 25 Jul 2025 13:35:19 +0700 Subject: [PATCH 1/4] [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); +} +} >From 4a11502e1e3336acefa24ca1536c9b5f4c430722 Mon Sep 17 00:00:00 2001 From: Serge Pavlov <sepavl...@gmail.com> Date: Tue, 29 Jul 2025 11:03:40 +0700 Subject: [PATCH 2/4] Change names in test --- clang/test/SemaCXX/noreturn-vars.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/test/SemaCXX/noreturn-vars.cpp b/clang/test/SemaCXX/noreturn-vars.cpp index 1bf074149f04c..1da70e05874e7 100644 --- a/clang/test/SemaCXX/noreturn-vars.cpp +++ b/clang/test/SemaCXX/noreturn-vars.cpp @@ -229,12 +229,12 @@ extern void abc_02(func_type *); namespace Issue150336 { void free(void *); typedef void (*sel_freefunc)(void *); -struct gmx_ana_selmethod_t { +struct selmethod_t { sel_freefunc free; int nparams; int *param; }; -void gmx_selelem_free_method(struct gmx_ana_selmethod_t* method, void* mdata) { +void selelem_free_method(struct selmethod_t* method, void* mdata) { sel_freefunc free_func = 0; for (int i = 0; i < method->nparams; ++i) free(&method->param[i]); >From 48997ac506a6f744332354403bd04c98be1da1a5 Mon Sep 17 00:00:00 2001 From: Serge Pavlov <sepavl...@gmail.com> Date: Wed, 30 Jul 2025 02:05:00 +0700 Subject: [PATCH 3/4] Move test into separate file --- clang/test/SemaCXX/noreturn-vars.cpp | 17 ----------------- clang/test/SemaCXX/noreturn-weverything.c | 16 ++++++++++++++++ 2 files changed, 16 insertions(+), 17 deletions(-) create mode 100644 clang/test/SemaCXX/noreturn-weverything.c diff --git a/clang/test/SemaCXX/noreturn-vars.cpp b/clang/test/SemaCXX/noreturn-vars.cpp index 1da70e05874e7..ca65fcf5ca31d 100644 --- a/clang/test/SemaCXX/noreturn-vars.cpp +++ b/clang/test/SemaCXX/noreturn-vars.cpp @@ -225,20 +225,3 @@ 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 selmethod_t { - sel_freefunc free; - int nparams; - int *param; -}; -void selelem_free_method(struct 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); -} -} diff --git a/clang/test/SemaCXX/noreturn-weverything.c b/clang/test/SemaCXX/noreturn-weverything.c new file mode 100644 index 0000000000000..6765e5836c042 --- /dev/null +++ b/clang/test/SemaCXX/noreturn-weverything.c @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -fsyntax-only %s -Weverything + +void free(void *); +typedef void (*set_free_func)(void *); +struct Method { + set_free_func free; + int nparams; + int *param; +}; +void selelem_free_method(struct Method* method, void* data) { + set_free_func free_func = 0; + for (int i = 0; i < method->nparams; ++i) + free(&method->param[i]); + if (data && free_func) + free_func(data); +} >From 102871083f519c587bab8e88e6afce84291da025 Mon Sep 17 00:00:00 2001 From: Serge Pavlov <sepavl...@gmail.com> Date: Wed, 30 Jul 2025 11:42:57 +0700 Subject: [PATCH 4/4] Remove unused structure field in the test --- clang/test/SemaCXX/noreturn-weverything.c | 1 - 1 file changed, 1 deletion(-) diff --git a/clang/test/SemaCXX/noreturn-weverything.c b/clang/test/SemaCXX/noreturn-weverything.c index 6765e5836c042..92a587d395639 100644 --- a/clang/test/SemaCXX/noreturn-weverything.c +++ b/clang/test/SemaCXX/noreturn-weverything.c @@ -3,7 +3,6 @@ void free(void *); typedef void (*set_free_func)(void *); struct Method { - set_free_func free; int nparams; int *param; }; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits