[clang] [webkit.UncountedLambdaCapturesChecker] Fix a regression that [[noescape]] on a member function no longer works. (PR #126016)
Ryosuke Niwa via cfe-commits
cfe-commits at lists.llvm.org
Wed Feb 5 22:55:50 PST 2025
https://github.com/rniwa created https://github.com/llvm/llvm-project/pull/126016
We should skip the first argument for CXXOperatorCallExpr, not other kinds of calls.
>From b4c9048f3f28bd0522338ef7e4498926b66db571 Mon Sep 17 00:00:00 2001
From: Ryosuke Niwa <rniwa at webkit.org>
Date: Wed, 5 Feb 2025 22:48:30 -0800
Subject: [PATCH] [webkit.UncountedLambdaCapturesChecker] Fix a regression that
[[noescape]] on a member function no longer works.
We should skip the first argument for CXXOperatorCallExpr, not other kinds of calls.
---
.../WebKit/UncountedLambdaCapturesChecker.cpp | 4 +---
.../WebKit/uncounted-lambda-captures.cpp | 23 +++++++++++++++++++
2 files changed, 24 insertions(+), 3 deletions(-)
diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedLambdaCapturesChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedLambdaCapturesChecker.cpp
index 53ef423bd82e7e2..a56f48c83c660a9 100644
--- a/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedLambdaCapturesChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/UncountedLambdaCapturesChecker.cpp
@@ -109,9 +109,7 @@ class UncountedLambdaCapturesChecker
bool VisitCallExpr(CallExpr *CE) override {
checkCalleeLambda(CE);
if (auto *Callee = CE->getDirectCallee()) {
- unsigned ArgIndex = 0;
- if (auto *CXXCallee = dyn_cast<CXXMethodDecl>(Callee))
- ArgIndex = CXXCallee->isInstance();
+ unsigned ArgIndex = isa<CXXOperatorCallExpr>(CE);
bool TreatAllArgsAsNoEscape = shouldTreatAllArgAsNoEscape(Callee);
for (auto *Param : Callee->parameters()) {
if (ArgIndex >= CE->getNumArgs())
diff --git a/clang/test/Analysis/Checkers/WebKit/uncounted-lambda-captures.cpp b/clang/test/Analysis/Checkers/WebKit/uncounted-lambda-captures.cpp
index 2a1a164557cdbe7..b6e84769fdf7247 100644
--- a/clang/test/Analysis/Checkers/WebKit/uncounted-lambda-captures.cpp
+++ b/clang/test/Analysis/Checkers/WebKit/uncounted-lambda-captures.cpp
@@ -63,6 +63,18 @@ template<typename Out, typename... In> Function<Out(In...)> adopt(Detail::Callab
return Function<Out(In...)>(impl, Function<Out(In...)>::Adopt);
}
+template <typename KeyType, typename ValueType>
+class HashMap {
+public:
+ HashMap();
+ HashMap([[clang::noescape]] const Function<ValueType()>&);
+ void ensure(const KeyType&, [[clang::noescape]] const Function<ValueType()>&);
+ bool operator+([[clang::noescape]] const Function<ValueType()>&) const;
+
+private:
+ ValueType* m_table { nullptr };
+};
+
} // namespace WTF
struct A {
@@ -268,6 +280,17 @@ struct RefCountableWithLambdaCapturingThis {
nonTrivial();
});
}
+
+ void method_captures_this_in_template_method() {
+ RefCountable* obj = make_obj();
+ WTF::HashMap<int, RefPtr<RefCountable>> nextMap;
+ nextMap.ensure(3, [&] {
+ return obj->next();
+ });
+ nextMap+[&] {
+ return obj->next();
+ };
+ }
};
struct NonRefCountableWithLambdaCapturingThis {
More information about the cfe-commits
mailing list