https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105078
--- Comment #4 from Martin Liška <marxin at gcc dot gnu.org> --- Note the libQt6 version of the function looking approximately like this: #include <cstdlib> #include <cstdint> #include <unistd.h> struct QArrayData { int size; __attribute__((malloc)) static void *allocate(QArrayData **pdata, size_t size, size_t alignment) { size_t headerSize = sizeof(QArrayData); headerSize += (alignment - alignof(QArrayData)); *pdata = static_cast<QArrayData *>(::malloc(headerSize + size)); (*pdata)->size = size; return reinterpret_cast<void *>(uintptr_t(*pdata) + headerSize); } }; template <class T> struct QTypedArrayData : QArrayData { class AlignmentDummy { QArrayData header; T data; }; static QTypedArrayData *allocate(size_t size) { QArrayData *d; QArrayData::allocate(&d, size, alignof(AlignmentDummy)); return static_cast<QTypedArrayData *>(d); } static T *dataStart(QArrayData *data, size_t alignment) { void *start = reinterpret_cast<void *>((uintptr_t(data) + sizeof(QArrayData) + alignment - 1) & ~(alignment - 1)); return static_cast<T *>(start); } }; int main() { int size = 256; auto *data = QTypedArrayData<char>::allocate(size); return readlink("asdf", data->dataStart(data, alignof(QTypedArrayData<char>::AlignmentDummy)), data->size - 1); }