================ @@ -2667,6 +2667,29 @@ bool QualType::isTriviallyCopyableType(const ASTContext &Context) const { /*IsCopyConstructible=*/false); } +bool QualType::isBitwiseCopyableType(const ASTContext & Context) const { + QualType CanonicalType = getCanonicalType(); + if (CanonicalType->isIncompleteType() || CanonicalType->isDependentType()) + return false; + // Trivially copyable types are bitwise copyable, e.g. scalar types. + if (CanonicalType.isTriviallyCopyableType(Context)) + return true; + + if (CanonicalType->isArrayType()) + return Context.getBaseElementType(CanonicalType) + .isBitwiseCopyableType(Context); + + if (const auto *RD = CanonicalType->getAsCXXRecordDecl()) { ---------------- hokein wrote:
Yeah, for reference members, its type is non-scalar type, thus this is excluded for now (reference types are also not trivially copyable). The current approach, is to traverse the entire class on every query, which has some cost. A more efficient alternative is to use an extra bit in the class definition data, we propagate this bit during the construction of this class. https://github.com/llvm/llvm-project/pull/86512 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits