================ @@ -2170,29 +2170,32 @@ static bool interp__builtin_memchr(InterpState &S, CodePtr OpPC, return true; } -static unsigned computeFullDescSize(const ASTContext &ASTCtx, - const Descriptor *Desc) { - +static std::optional<unsigned> computeFullDescSize(const ASTContext &ASTCtx, + const Descriptor *Desc) { if (Desc->isPrimitive()) return ASTCtx.getTypeSizeInChars(Desc->getType()).getQuantity(); - if (Desc->isArray()) return ASTCtx.getTypeSizeInChars(Desc->getElemQualType()).getQuantity() * Desc->getNumElems(); + if (Desc->isRecord()) { + // Can't use Descriptor::getType() as that may return a pointer type. Look + // at the decl directly. + return ASTCtx + .getTypeSizeInChars( + ASTCtx.getCanonicalTagType(Desc->ElemRecord->getDecl())) + .getQuantity(); + } - if (Desc->isRecord()) - return ASTCtx.getTypeSizeInChars(Desc->getType()).getQuantity(); - - llvm_unreachable("Unhandled descriptor type"); - return 0; + return std::nullopt; } +/// Compute the byte offset of \p Ptr in the full declaration. static unsigned computePointerOffset(const ASTContext &ASTCtx, const Pointer &Ptr) { unsigned Result = 0; Pointer P = Ptr; - while (P.isArrayElement() || P.isField()) { + while (P.isField() || P.isArrayElement()) { ---------------- shafik wrote:
I guess you switched the order b/d `isField` is way more likely to be `true` and short circuit? If so that deserve a comment for future folks to keep in mind. https://github.com/llvm/llvm-project/pull/153601 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits