[clang] [clang][ThreadSafety] Fix a crash on a capability expression calling a pointer to member (PR #231995)

Marco Elver via cfe-commits cfe-commits at lists.llvm.org
Thu Oct 15 06:46:23 PDT 2026


================
@@ -570,9 +573,10 @@ til::SExpr *SExprBuilder::translateCallExpr(const CallExpr *CE,
 til::SExpr *SExprBuilder::translateCXXMemberCallExpr(
     const CXXMemberCallExpr *ME, CallingContext *Ctx) {
   if (CapabilityExprMode) {
-    // Ignore calls to get() on smart pointers.
-    if (ME->getMethodDecl()->getNameAsString() == "get" &&
-        ME->getNumArgs() == 0) {
+    // Ignore calls to get() on smart pointers. A call through a pointer to
+    // member function has no method declaration.
+    const CXXMethodDecl *MD = ME->getMethodDecl();
+    if (MD && MD->getNameAsString() == "get" && ME->getNumArgs() == 0) {
----------------
melver wrote:

Nit: while touching this condition, checking `ME->getNumArgs() == 0` first and using `MD->getIdentifier() && MD->getIdentifier()->isStr("get")` (matching `VarMapBuilder::VisitCallExpr` in `ThreadSafety.cpp`) avoids heap-allocating a `std::string` via `getNameAsString()` on every member call.

https://github.com/llvm/llvm-project/pull/231995


More information about the cfe-commits mailing list