https://github.com/geoffreygaren created 
https://github.com/llvm/llvm-project/pull/224726

So an upcoming borrow checker can skip it.

(A guardian variable is an independent declaration that ensures a lifetime. 
Borrow checking does not accept guardian variables because they do not convey 
`lifetimebound` links.)

Assisted-by: Claude

>From 71be397995ddb1822daabeea97ff9a84d6005962 Mon Sep 17 00:00:00 2001
From: Geoff Garen <[email protected]>
Date: Tue, 25 Aug 2026 19:17:22 -0700
Subject: [PATCH] [WebKit Checkers] Extract hasGuardian from isPtrOriginSafe in
 RawPtrRefLocalVarsChecker

So an upcoming borrow checker can skip it.

(A guardian variable is an independent declaration that ensures a lifetime. 
Borrow
checking does not accept guardian variables because they do not convey 
`lifetimebound`
links.)

Assisted-by: Claude
---
 .../WebKit/RawPtrRefLocalVarsChecker.cpp      | 61 +++++++++----------
 1 file changed, 30 insertions(+), 31 deletions(-)

diff --git 
a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefLocalVarsChecker.cpp 
b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefLocalVarsChecker.cpp
index b0ebfea4b1410..e67808fd407eb 100644
--- a/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefLocalVarsChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/RawPtrRefLocalVarsChecker.cpp
@@ -372,42 +372,41 @@ class RawPtrRefLocalVarsChecker
           if (Model->isSafeExpr(InitArgOrigin))
             return true;
 
-          if (auto *Ref = llvm::dyn_cast<DeclRefExpr>(InitArgOrigin)) {
-            if (auto *MaybeGuardian =
-                    dyn_cast_or_null<VarDecl>(Ref->getFoundDecl())) {
-              const auto *MaybeGuardianArgType =
-                  MaybeGuardian->getType().getTypePtr();
-              if (MaybeGuardianArgType) {
-                const CXXRecordDecl *const MaybeGuardianArgCXXRecord =
-                    MaybeGuardianArgType->getAsCXXRecordDecl();
-                if (MaybeGuardianArgCXXRecord) {
-                  if (MaybeGuardian->isLocalVarDecl() &&
-                      (Model->isSafePtr(MaybeGuardianArgCXXRecord) ||
-                       isRefcountedStringsHack(MaybeGuardian)) &&
-                      isGuardedScopeEmbeddedInGuardianScope(V, MaybeGuardian))
-                    return true;
-                }
-              }
-
-              if (isa<ParmVarDecl>(MaybeGuardian)) {
-                if (auto *FD = dyn_cast<FunctionDecl>(DeclWithIssue)) {
-                  if (GuardianVisitor{MaybeGuardian}.TraverseStmt(
-                          FD->getBody()))
-                    return true;
-                }
-                if (auto *MD = dyn_cast<ObjCMethodDecl>(DeclWithIssue)) {
-                  if (GuardianVisitor{MaybeGuardian}.TraverseStmt(
-                          MD->getBody()))
-                    return true;
-                }
-              }
-            }
-          }
+          if (hasGuardian(V, InitArgOrigin, DeclWithIssue))
+            return true;
 
           return false;
         });
   }
 
+  bool hasGuardian(const VarDecl *V, const Expr *InitArgOrigin,
+                   const Decl *DeclWithIssue) const {
+    auto *Ref = dyn_cast<DeclRefExpr>(InitArgOrigin);
+    if (!Ref)
+      return false;
+
+    auto *MaybeGuardian = dyn_cast_or_null<VarDecl>(Ref->getFoundDecl());
+    if (!MaybeGuardian)
+      return false;
+
+    if (auto *Record = MaybeGuardian->getType()->getAsCXXRecordDecl()) {
+      if (MaybeGuardian->isLocalVarDecl() &&
+          (Model->isSafePtr(Record) ||
+           isRefcountedStringsHack(MaybeGuardian)) &&
+          isGuardedScopeEmbeddedInGuardianScope(V, MaybeGuardian))
+        return true;
+    }
+
+    if (isa<ParmVarDecl>(MaybeGuardian)) {
+      if (auto *FD = dyn_cast<FunctionDecl>(DeclWithIssue))
+        return GuardianVisitor{MaybeGuardian}.TraverseStmt(FD->getBody());
+      if (auto *MD = dyn_cast<ObjCMethodDecl>(DeclWithIssue))
+        return GuardianVisitor{MaybeGuardian}.TraverseStmt(MD->getBody());
+    }
+
+    return false;
+  }
+
   bool shouldSkipVarDecl(const VarDecl *V) const {
     assert(V);
     if (isa<ImplicitParamDecl>(V))

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

Reply via email to