https://github.com/melver created 
https://github.com/llvm/llvm-project/pull/209330

Previously, statement expressions (`({ bool b = mu.TryLock(); b; })`) used as 
try-lock conditions were not supported. Handle StmtExpr in getTrylockCallExpr() 
by recursively analyzing the last statement of the statement expression.

>From 61cb84697a63faf51facad8bf0bcbc4179851d53 Mon Sep 17 00:00:00 2001
From: Marco Elver <[email protected]>
Date: Tue, 14 Jul 2026 00:48:12 +0200
Subject: [PATCH] Thread Safety Analysis: Handle statement expressions in
 try-lock conditions

Previously, statement expressions (`({ bool b = mu.TryLock(); b; })`)
used as try-lock conditions were not supported. Handle StmtExpr in
getTrylockCallExpr() by recursively analyzing the last statement of the
statement expression.
---
 clang/lib/Analysis/ThreadSafety.cpp                |  5 +++++
 clang/test/SemaCXX/warn-thread-safety-analysis.cpp | 14 ++++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/clang/lib/Analysis/ThreadSafety.cpp 
b/clang/lib/Analysis/ThreadSafety.cpp
index 099e8590b50e3..70df7731aef7a 100644
--- a/clang/lib/Analysis/ThreadSafety.cpp
+++ b/clang/lib/Analysis/ThreadSafety.cpp
@@ -1659,6 +1659,11 @@ const CallExpr* 
ThreadSafetyAnalyzer::getTrylockCallExpr(const Stmt *Cond,
         return getTrylockCallExpr(COP->getCond(), C, Negate);
       }
     }
+  } else if (const auto *SE = dyn_cast<StmtExpr>(Cond)) {
+    if (const auto *CS = SE->getSubStmt(); CS && !CS->body_empty()) {
+      if (const auto *E = dyn_cast<Expr>(CS->body_back()))
+        return getTrylockCallExpr(E, C, Negate);
+    }
   }
   return nullptr;
 }
diff --git a/clang/test/SemaCXX/warn-thread-safety-analysis.cpp 
b/clang/test/SemaCXX/warn-thread-safety-analysis.cpp
index d70d5f99cb515..9f11fdcf78f01 100644
--- a/clang/test/SemaCXX/warn-thread-safety-analysis.cpp
+++ b/clang/test/SemaCXX/warn-thread-safety-analysis.cpp
@@ -2008,6 +2008,13 @@ struct TestTryLock {
     }
   }
 
+  void foo3_stmtexpr() {
+    if (({ bool b = mu.TryLock(); b; })) {
+      a = 3;
+      mu.Unlock();
+    }
+  }
+
   void foo3_builtin_expect() {
     bool b = mu.TryLock();
     if (__builtin_expect(b, true)) {
@@ -2016,6 +2023,13 @@ struct TestTryLock {
     }
   }
 
+  void foo3_builtin_expect_stmtexpr() {
+    if (({ bool b = mu.TryLock(); __builtin_expect(b, true); })) {
+      a = 3;
+      mu.Unlock();
+    }
+  }
+
   void foo4() {
     bool b = mu.TryLock();
     if (!b) return;

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to