From 6597049558a4b5f49000fd587b7d5b3bea42b583 Mon Sep 17 00:00:00 2001 From: Jake Turner Date: Mon, 5 Oct 2026 21:33:41 +0100 Subject: [PATCH] Add #define for calcoffset() to fix Apple clang compile error - offset of on non-standard-layout type -Winvalid-offsetof --- renderdoc/driver/metal/metal_types.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/renderdoc/driver/metal/metal_types.cpp b/renderdoc/driver/metal/metal_types.cpp index 88a69acd4..9112764bc 100644 --- a/renderdoc/driver/metal/metal_types.cpp +++ b/renderdoc/driver/metal/metal_types.cpp @@ -40,12 +40,18 @@ RDCCOMPILE_ASSERT(sizeof(NS::Integer) == sizeof(std::intptr_t), "NS::Integer siz RDCCOMPILE_ASSERT(sizeof(NS::UInteger) == sizeof(std::uintptr_t), "NS::UInteger size does not match"); +#define calcoffset(TYPE, ELEMENT) ((size_t) & (((TYPE *)0)->ELEMENT)) + #define DEFINE_OBJC_HELPERS(CPPTYPE) \ void AllocateObjCBridge(WrappedMTL##CPPTYPE *wrappedCPP) \ { \ - RDCCOMPILE_ASSERT((offsetof(WrappedMTL##CPPTYPE, m_ObjcBridge) == 0), \ - "m_ObjcBridge must be at offsetof 0"); \ const char *const className = "ObjCBridgeMTL" #CPPTYPE; \ + static size_t offset = calcoffset(WrappedMTL##CPPTYPE, m_ObjcBridge); \ + if(offset != 0) \ + { \ + RDCFATAL("'%s' m_ObjcBridge must be at offset of 0 %lu", className, offset, \ + "m_ObjcBridge must be at offsetof 0"); \ + } \ static Class klass = objc_lookUpClass(className); \ static size_t classSize = class_getInstanceSize(klass); \ if(classSize != sizeof(wrappedCPP->m_ObjcBridge)) \