================ @@ -2415,46 +2415,112 @@ DiagnosticBuilder ItaniumRecordLayoutBuilder::Diag(SourceLocation Loc, return Context.getDiagnostics().Report(Loc, DiagID); } +/// https://itanium-cxx-abi.github.io/cxx-abi/abi.html#POD +/// POD for the purpose of layout +/// In general, a type is considered a POD for the purposes of layout if it is +/// a POD type (in the sense of ISO C++ [basic.types]). However, a type is not +/// considered to be a POD for the purpose of layout if it is: +/// - a POD-struct or POD-union (in the sense of ISO C++ [class]) with a +/// bit-field whose declared width is wider than the declared type of the +/// bit-field, or +/// - an array type whose element type is not a POD for the purpose of +/// layout, or +/// - a POD-struct with one or more potentially-overlapping non-static data +/// members. +/// Where references to the ISO C++ are made in this paragraph, the Technical +/// Corrigendum 1 version of the standard is intended. +/// +/// This function does not check if the type is POD first +static bool isItaniumPOD(const ASTContext &Context, const CXXRecordDecl *RD) { + const auto IsDisqualifying = [&](const FieldDecl *FD) -> bool { + if (FD->isBitField()) + if (FD->getBitWidthValue(Context) > Context.getTypeSize(FD->getType())) + return true; + + return FD->isPotentiallyOverlapping(); + }; + + if (llvm::any_of(RD->fields(), IsDisqualifying)) + return false; + + return RD->forallBases([&](const CXXRecordDecl *Base) -> bool { + return llvm::any_of(Base->fields(), IsDisqualifying); + }); +} + /// Does the target C++ ABI require us to skip over the tail-padding /// of the given class (considering it as a base class) when allocating /// objects? -static bool mustSkipTailPadding(TargetCXXABI ABI, const CXXRecordDecl *RD) { - switch (ABI.getTailPaddingUseRules()) { - case TargetCXXABI::AlwaysUseTailPadding: - return false; +static bool mustSkipTailPadding(const ASTContext &Context, TargetCXXABI ABI, + const CXXRecordDecl *RD) { + // This is equivalent to + // Context.getTypeDeclType(RD).isCXX11PODType(Context), + // but with a lot of abstraction penalty stripped off. This does + // assume that these properties are set correctly even in C++98 + // mode; fortunately, that is true because we want to assign + // consistently semantics to the type-traits intrinsics (or at ---------------- rjmccall wrote:
```suggestion // consistent semantics to the type-traits intrinsics (or at ``` https://github.com/llvm/llvm-project/pull/90462 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits