[clang] bc3d3c9 - [AllocToken] Fix typeContainsPointer for references, PMFs, blocks, ObjC pointers (#211349)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 22 23:52:39 PDT 2026
Author: Marco Elver
Date: 2026-07-23T08:52:35+02:00
New Revision: bc3d3c9e3af37fab009d3fa10349f56b150e69d4
URL: https://github.com/llvm/llvm-project/commit/bc3d3c9e3af37fab009d3fa10349f56b150e69d4
DIFF: https://github.com/llvm/llvm-project/commit/bc3d3c9e3af37fab009d3fa10349f56b150e69d4.diff
LOG: [AllocToken] Fix typeContainsPointer for references, PMFs, blocks, ObjC pointers (#211349)
When evaluating whether an allocated type contains a pointer to generate
the alloc_token metadata, typeContainsPointer() previously only checked
for PointerType.
Expand typeContainsPointer() to check isAnyPointerType(),
isReferenceType(), isMemberFunctionPointerType(), and
isBlockPointerType().
Added:
clang/test/CodeGenObjCXX/alloc-token-pointer.mm
Modified:
clang/lib/AST/InferAlloc.cpp
clang/test/CodeGenCXX/alloc-token-pointer.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/InferAlloc.cpp b/clang/lib/AST/InferAlloc.cpp
index 5ceb6f4a85e7f..6c99a81d739f1 100644
--- a/clang/lib/AST/InferAlloc.cpp
+++ b/clang/lib/AST/InferAlloc.cpp
@@ -27,7 +27,9 @@ typeContainsPointer(QualType T,
llvm::SmallPtrSet<const RecordDecl *, 4> &VisitedRD,
bool &IncompleteType) {
QualType CanonicalType = T.getCanonicalType();
- if (CanonicalType->isPointerType())
+ if (CanonicalType->isAnyPointerType() || CanonicalType->isReferenceType() ||
+ CanonicalType->isMemberFunctionPointerType() ||
+ CanonicalType->isBlockPointerType())
return true; // base case
// Look through typedef chain to check for special types.
diff --git a/clang/test/CodeGenCXX/alloc-token-pointer.cpp b/clang/test/CodeGenCXX/alloc-token-pointer.cpp
index d352880711435..40f4c8001dc5e 100644
--- a/clang/test/CodeGenCXX/alloc-token-pointer.cpp
+++ b/clang/test/CodeGenCXX/alloc-token-pointer.cpp
@@ -207,6 +207,38 @@ StructWithAtomicNonPtr *test_struct_with_atomic_nonptr() {
return new StructWithAtomicNonPtr;
}
+struct Dummy { void foo(); int data; };
+
+struct StructWithRef {
+ int &r;
+};
+
+// CHECK-LABEL: define dso_local noundef ptr @_Z20test_struct_with_refPi(
+// CHECK: call noalias noundef nonnull ptr @_Znwm(i64 noundef 8){{.*}} !alloc_token [[META_STRUCTWITHREF:![0-9]+]]
+StructWithRef *test_struct_with_ref(int *p) {
+ return new StructWithRef{*p};
+}
+
+struct StructWithPMF {
+ void (Dummy::*pmf)();
+};
+
+// CHECK-LABEL: define dso_local noundef ptr @_Z20test_struct_with_pmfv(
+// CHECK: call noalias noundef nonnull ptr @_Znwm(i64 noundef 16){{.*}} !alloc_token [[META_STRUCTWITHPMF:![0-9]+]]
+StructWithPMF *test_struct_with_pmf() {
+ return new StructWithPMF;
+}
+
+struct StructWithPMD {
+ int Dummy::*pmd;
+};
+
+// CHECK-LABEL: define dso_local noundef ptr @_Z20test_struct_with_pmdv(
+// CHECK: call noalias noundef nonnull ptr @_Znwm(i64 noundef 8){{.*}} !alloc_token [[META_STRUCTWITHPMD:![0-9]+]]
+StructWithPMD *test_struct_with_pmd() {
+ return new StructWithPMD;
+}
+
// CHECK: [[META_INT]] = !{!"int", i1 false}
// CHECK: [[META_INTPTR]] = !{!"int *", i1 true}
// CHECK: [[META_ULONG]] = !{!"unsigned long", i1 false}
@@ -217,3 +249,6 @@ StructWithAtomicNonPtr *test_struct_with_atomic_nonptr() {
// CHECK: [[META_UINTPTR]] = !{!"unsigned long", i1 true}
// CHECK: [[META_STRUCTWITHATOMIC]] = !{!"StructWithAtomic", i1 true}
// CHECK: [[META_STRUCTWITHATOMICNONPTR]] = !{!"StructWithAtomicNonPtr", i1 false}
+// CHECK: [[META_STRUCTWITHREF]] = !{!"StructWithRef", i1 true}
+// CHECK: [[META_STRUCTWITHPMF]] = !{!"StructWithPMF", i1 true}
+// CHECK: [[META_STRUCTWITHPMD]] = !{!"StructWithPMD", i1 false}
diff --git a/clang/test/CodeGenObjCXX/alloc-token-pointer.mm b/clang/test/CodeGenObjCXX/alloc-token-pointer.mm
new file mode 100644
index 0000000000000..08671fb79821b
--- /dev/null
+++ b/clang/test/CodeGenObjCXX/alloc-token-pointer.mm
@@ -0,0 +1,28 @@
+// RUN: %clang_cc1 -fsanitize=alloc-token -triple x86_64-apple-macosx10.15.0 -std=c++20 -fblocks -fobjc-arc -emit-llvm -disable-llvm-passes %s -o - | FileCheck %s
+
+ at class ObjCClass;
+
+struct StructWithBlock {
+ void (^b)(void);
+};
+
+// CHECK-LABEL: define {{.*}}ptr @_Z22test_struct_with_blockv(
+// CHECK: call noalias noundef nonnull ptr @_Znwm(i64 noundef 8){{.*}} !alloc_token [[META_STRUCTWITHBLOCK:![0-9]+]]
+StructWithBlock *test_struct_with_block() {
+ return new StructWithBlock;
+}
+
+struct StructWithObjCPtr {
+ id obj;
+ Class cls;
+ ObjCClass *ptr;
+};
+
+// CHECK-LABEL: define {{.*}}ptr @_Z25test_struct_with_objc_ptrv(
+// CHECK: call noalias noundef nonnull ptr @_Znwm(i64 noundef 24){{.*}} !alloc_token [[META_STRUCTWITHOBJCPTR:![0-9]+]]
+StructWithObjCPtr *test_struct_with_objc_ptr() {
+ return new StructWithObjCPtr;
+}
+
+// CHECK: [[META_STRUCTWITHBLOCK]] = !{!"StructWithBlock", i1 true}
+// CHECK: [[META_STRUCTWITHOBJCPTR]] = !{!"StructWithObjCPtr", i1 true}
More information about the cfe-commits
mailing list