Author: Ryosuke Niwa Date: 2025-02-11T11:07:52-08:00 New Revision: 8c67f14f628420a5e06fe631ec6b323f096f2a43
URL: https://github.com/llvm/llvm-project/commit/8c67f14f628420a5e06fe631ec6b323f096f2a43 DIFF: https://github.com/llvm/llvm-project/commit/8c67f14f628420a5e06fe631ec6b323f096f2a43.diff LOG: [WebKit Checkers] Allow operator T&() in a const member function (#126470) Allow operator T&() in a member function which returns a const member variable. In particular, this will allow UniqueRef::operator T&() and Ref::operator T&() to be treated as a safe pointer origin when they're called on a const member. Added: Modified: clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp clang/test/Analysis/Checkers/WebKit/call-args-counted-const-member.cpp clang/test/Analysis/Checkers/WebKit/mock-types.h Removed: ################################################################################ diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp index 5d28982c41fc4..6452dedb8c391 100644 --- a/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/ASTUtils.cpp @@ -154,10 +154,10 @@ bool isConstOwnerPtrMemberExpr(const clang::Expr *E) { if (auto *MCE = dyn_cast<CXXMemberCallExpr>(E)) { if (auto *Callee = MCE->getDirectCallee()) { auto Name = safeGetName(Callee); - if (Name == "get" || Name == "ptr") { - auto *ThisArg = MCE->getImplicitObjectArgument(); - E = ThisArg; - } + if (Name == "get" || Name == "ptr") + E = MCE->getImplicitObjectArgument(); + if (auto *CD = dyn_cast<CXXConversionDecl>(Callee)) + E = MCE->getImplicitObjectArgument(); } } else if (auto *OCE = dyn_cast<CXXOperatorCallExpr>(E)) { if (OCE->getOperator() == OO_Star && OCE->getNumArgs() == 1) diff --git a/clang/test/Analysis/Checkers/WebKit/call-args-counted-const-member.cpp b/clang/test/Analysis/Checkers/WebKit/call-args-counted-const-member.cpp index 215238a7fcf07..8da415a818a82 100644 --- a/clang/test/Analysis/Checkers/WebKit/call-args-counted-const-member.cpp +++ b/clang/test/Analysis/Checkers/WebKit/call-args-counted-const-member.cpp @@ -31,6 +31,7 @@ class Foo { public: Foo(); void bar(); + RefCountable& obj1() const { return m_obj1; } private: const Ref<RefCountable> m_obj1; @@ -41,6 +42,7 @@ void Foo::bar() { m_obj1->method(); m_obj2->method(); // expected-warning@-1{{Call argument for 'this' parameter is uncounted and unsafe}} + obj1().method(); } } // namespace call_args_const_ref_member @@ -100,6 +102,7 @@ class Foo { public: Foo(); void bar(); + RefCountable& obj1() { return m_obj1; } private: const UniqueRef<RefCountable> m_obj1; @@ -110,6 +113,7 @@ void Foo::bar() { m_obj1->method(); m_obj2->method(); // expected-warning@-1{{Call argument for 'this' parameter is uncounted and unsafe}} + obj1().method(); } } // namespace call_args_const_unique_ref diff --git a/clang/test/Analysis/Checkers/WebKit/mock-types.h b/clang/test/Analysis/Checkers/WebKit/mock-types.h index 85397c2d25951..a1f0cc8b046b9 100644 --- a/clang/test/Analysis/Checkers/WebKit/mock-types.h +++ b/clang/test/Analysis/Checkers/WebKit/mock-types.h @@ -289,6 +289,7 @@ class UniqueRef { u.t = nullptr; } T &get() const { return *t; } + operator T&() const { return *t; } T *operator->() const { return t; } UniqueRef &operator=(T &) { return *this; } }; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits