================
@@ -1839,6 +1839,39 @@ static void handleRestrictAttr(Sema &S, Decl *D, const
ParsedAttr &AL) {
RestrictAttr(S.Context, AL, DeallocE, DeallocPtrIdx));
}
+static bool isSpanLikeType(const QualType &Ty) {
+ // Check that the type is a plain record with the first field being a pointer
+ // type and the second field being an integer.
+ // This matches the common implementation of std::span or sized_allocation_t
+ // in P0901R11.
+ // Note that there may also be numerous cases of pointer+integer structures
+ // not actually exhibiting a std::span-like semantics, so sometimes
+ // this heuristic expectedly leads to false positive results.
+ const RecordDecl *RD = Ty->getAsRecordDecl();
+ if (!RD || RD->isUnion())
+ return false;
+ const RecordDecl *Def = RD->getDefinition();
+ if (!Def)
+ return false; // This is an incomplete type.
+ auto FieldsBegin = Def->field_begin();
+ if (std::distance(FieldsBegin, Def->field_end()) != 2)
+ return false;
+ const FieldDecl *FirstField = *FieldsBegin;
+ const FieldDecl *SecondField = *std::next(FieldsBegin);
+ return FirstField->getType()->isAnyPointerType() &&
----------------
a-nogikh wrote:
If we are to relax this requirement as well, I wonder if we should go one step
further and also lift the restriction on having just 2 fields in this struct,
i.e. only ensure that the struct has some pointer field and (at least one)
integer field.
https://github.com/llvm/llvm-project/pull/167010
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits