https://github.com/spavloff updated 
https://github.com/llvm/llvm-project/pull/150582

>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 1/3] [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 c74d6bd858afb0e5d1dfae9935e8a43564a0d471 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/3] 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 03c2c00857ab8066103a4081d8cdf2e947bfa15b 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/3] 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);
+}

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to