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