[llvm-branch-commits] [clang] Transparent functions for all gsl::Pointers (PR #177660)
Utkarsh Saxena via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Jan 27 03:19:28 PST 2026
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 <usx at google.com>
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()) {
More information about the llvm-branch-commits
mailing list