https://github.com/usx95 updated https://github.com/llvm/llvm-project/pull/177660
>From 0e0e36c714dd65f8e1fd4cd0af098b6d9dd4ffb8 Mon Sep 17 00:00:00 2001 From: Utkarsh Saxena <[email protected]> Date: Fri, 23 Jan 2026 15:58:55 +0000 Subject: [PATCH] Transparent functions for all gsl::Pointers --- .../LifetimeSafety/LifetimeAnnotations.cpp | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/clang/lib/Analysis/LifetimeSafety/LifetimeAnnotations.cpp b/clang/lib/Analysis/LifetimeSafety/LifetimeAnnotations.cpp index dd925d2b8fe6e..4215a805dbf91 100644 --- a/clang/lib/Analysis/LifetimeSafety/LifetimeAnnotations.cpp +++ b/clang/lib/Analysis/LifetimeSafety/LifetimeAnnotations.cpp @@ -13,6 +13,7 @@ #include "clang/AST/DeclTemplate.h" #include "clang/AST/Type.h" #include "clang/AST/TypeLoc.h" +#include "llvm/ADT/StringSet.h" namespace clang::lifetimes { @@ -115,35 +116,36 @@ bool shouldTrackImplicitObjectArg(const CXXMethodDecl *Callee, if (isGslPointerType(Conv->getConversionType()) && Callee->getParent()->hasAttr<OwnerAttr>()) return true; - if (!isInStlNamespace(Callee->getParent())) - return false; if (!isGslPointerType(Callee->getFunctionObjectParameterType()) && !isGslOwnerType(Callee->getFunctionObjectParameterType())) return false; + static const llvm::StringSet<> TransparentFns = { + // Begin and end iterators. + "begin", "end", "rbegin", "rend", "cbegin", "cend", "crbegin", "crend", + // Inner pointer getters. + "c_str", "data", "get", + // Map and set types. + "find", "equal_range", "lower_bound", "upper_bound"}; // Track dereference operator for GSL pointers in STL. Only do so for lifetime // safety analysis and not for Sema's statement-local analysis as it starts // to have false-positives. if (RunningUnderLifetimeSafety && - isGslPointerType(Callee->getFunctionObjectParameterType()) && - (Callee->getOverloadedOperator() == OverloadedOperatorKind::OO_Star || - Callee->getOverloadedOperator() == OverloadedOperatorKind::OO_Arrow)) - return true; + isGslPointerType(Callee->getFunctionObjectParameterType())) { + if (Callee->getOverloadedOperator() == OverloadedOperatorKind::OO_Star || + Callee->getOverloadedOperator() == OverloadedOperatorKind::OO_Arrow) + return true; + if (Callee->getIdentifier() && TransparentFns.contains(Callee->getName())) + return true; + } + + if (!isInStlNamespace(Callee->getParent())) + return false; if (isPointerLikeType(Callee->getReturnType())) { if (!Callee->getIdentifier()) return false; - return llvm::StringSwitch<bool>(Callee->getName()) - .Cases( - {// Begin and end iterators. - "begin", "end", "rbegin", "rend", "cbegin", "cend", "crbegin", - "crend", - // Inner pointer getters. - "c_str", "data", "get", - // Map and set types. - "find", "equal_range", "lower_bound", "upper_bound"}, - true) - .Default(false); + return TransparentFns.contains(Callee->getName()); } if (Callee->getReturnType()->isReferenceType()) { if (!Callee->getIdentifier()) { _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
