[clang] 12ccb62 - [clang] Add a common definition of isPointerLikeType for lifetime analysis (#117315)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Nov 28 04:24:44 PST 2024
Author: Utkarsh Saxena
Date: 2024-11-28T17:54:40+05:30
New Revision: 12ccb628da231f3ab751c8e7b759e9920d38510b
URL: https://github.com/llvm/llvm-project/commit/12ccb628da231f3ab751c8e7b759e9920d38510b
DIFF: https://github.com/llvm/llvm-project/commit/12ccb628da231f3ab751c8e7b759e9920d38510b.diff
LOG: [clang] Add a common definition of isPointerLikeType for lifetime analysis (#117315)
Also checks for annotation for template specializations which sometimes
may not have the annotation attached.
Added:
Modified:
clang/lib/Sema/CheckExprLifetime.cpp
clang/lib/Sema/CheckExprLifetime.h
clang/lib/Sema/SemaAttr.cpp
Removed:
################################################################################
diff --git a/clang/lib/Sema/CheckExprLifetime.cpp b/clang/lib/Sema/CheckExprLifetime.cpp
index 607b7daf878e17..de69d6537b5692 100644
--- a/clang/lib/Sema/CheckExprLifetime.cpp
+++ b/clang/lib/Sema/CheckExprLifetime.cpp
@@ -9,6 +9,7 @@
#include "CheckExprLifetime.h"
#include "clang/AST/Decl.h"
#include "clang/AST/Expr.h"
+#include "clang/AST/Type.h"
#include "clang/Basic/DiagnosticSema.h"
#include "clang/Sema/Initialization.h"
#include "clang/Sema/Sema.h"
@@ -253,9 +254,17 @@ static void visitLocalsRetainedByReferenceBinding(IndirectLocalPath &Path,
LocalVisitor Visit);
template <typename T> static bool isRecordWithAttr(QualType Type) {
- if (auto *RD = Type->getAsCXXRecordDecl())
- return RD->hasAttr<T>();
- return false;
+ auto *RD = Type->getAsCXXRecordDecl();
+ if (!RD)
+ return false;
+ if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(RD))
+ RD = CTSD->getSpecializedTemplate()->getTemplatedDecl();
+ return RD->hasAttr<T>();
+}
+
+bool isPointerLikeType(QualType QT) {
+ return isRecordWithAttr<PointerAttr>(QT) || QT->isPointerType() ||
+ QT->isNullPtrType();
}
// Decl::isInStdNamespace will return false for iterators in some STL
@@ -276,11 +285,6 @@ static bool isInStlNamespace(const Decl *D) {
return DC->isStdNamespace();
}
-static bool isPointerLikeType(QualType Type) {
- return isRecordWithAttr<PointerAttr>(Type) || Type->isPointerType() ||
- Type->isNullPtrType();
-}
-
// Returns true if the given Record decl is a form of `GSLOwner<Pointer>`
// type, e.g. std::vector<string_view>, std::optional<string_view>.
static bool isContainerOfPointer(const RecordDecl *Container) {
diff --git a/clang/lib/Sema/CheckExprLifetime.h b/clang/lib/Sema/CheckExprLifetime.h
index b10c84363527a7..95c249c6109774 100644
--- a/clang/lib/Sema/CheckExprLifetime.h
+++ b/clang/lib/Sema/CheckExprLifetime.h
@@ -18,6 +18,10 @@
namespace clang::sema {
+// Tells whether the type is annotated with [[gsl::Pointer]] or is a pointer
+// type.
+bool isPointerLikeType(QualType QT);
+
/// Describes an entity that is being assigned.
struct AssignedEntity {
// The left-hand side expression of the assignment.
diff --git a/clang/lib/Sema/SemaAttr.cpp b/clang/lib/Sema/SemaAttr.cpp
index 716d8ed1fae4f8..b0849c74e375ed 100644
--- a/clang/lib/Sema/SemaAttr.cpp
+++ b/clang/lib/Sema/SemaAttr.cpp
@@ -269,18 +269,6 @@ void Sema::inferLifetimeBoundAttribute(FunctionDecl *FD) {
}
}
-static bool isPointerLikeType(QualType QT) {
- QT = QT.getNonReferenceType();
- if (QT->isPointerType())
- return true;
- auto *RD = QT->getAsCXXRecordDecl();
- if (!RD)
- return false;
- if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(RD))
- RD = CTSD->getSpecializedTemplate()->getTemplatedDecl();
- return RD->hasAttr<PointerAttr>();
-}
-
void Sema::inferLifetimeCaptureByAttribute(FunctionDecl *FD) {
if (!FD)
return;
@@ -299,7 +287,7 @@ void Sema::inferLifetimeCaptureByAttribute(FunctionDecl *FD) {
if (PVD->hasAttr<LifetimeCaptureByAttr>())
return;
for (ParmVarDecl *PVD : MD->parameters()) {
- if (isPointerLikeType(PVD->getType())) {
+ if (sema::isPointerLikeType(PVD->getType().getNonReferenceType())) {
int CaptureByThis[] = {LifetimeCaptureByAttr::THIS};
PVD->addAttr(
LifetimeCaptureByAttr::CreateImplicit(Context, CaptureByThis, 1));
More information about the cfe-commits
mailing list