@@ -502,17 +502,28 @@ GetUserDefinedCopyConstructor(const clang::RecordDecl *decl) {
502502 return nullptr ;
503503}
504504
505+ static bool FieldsHaveCallableCopyConstructors (const clang::RecordDecl *decl) {
506+ auto &ctx = decl->getASTContext ();
507+ return std::ranges::all_of (decl->fields (), [&](const clang::FieldDecl *f) {
508+ auto *record = ctx.getBaseElementType (f->getType ())->getAsCXXRecordDecl ();
509+ return !record || !IsUserDefinedDecl (record) ||
510+ HasCallableCopyConstructor (record);
511+ });
512+ }
513+
505514bool HasDefaultedCopyConstructor (const clang::RecordDecl *decl) {
506515 auto *cxx = clang::dyn_cast<clang::CXXRecordDecl>(decl);
507516 if (!cxx) {
508517 return true ;
509518 }
510519 for (const auto *ctor : cxx->ctors ()) {
511520 if (ctor->isCopyConstructor ()) {
512- return !ctor->isUserProvided () && !ctor->isDeleted ();
521+ return !ctor->isUserProvided () && !ctor->isDeleted () &&
522+ FieldsHaveCallableCopyConstructors (cxx);
513523 }
514524 }
515- return !cxx->defaultedCopyConstructorIsDeleted ();
525+ return !cxx->defaultedCopyConstructorIsDeleted () &&
526+ FieldsHaveCallableCopyConstructors (cxx);
516527}
517528
518529bool RecordHasOnlyReferenceFields (const clang::RecordDecl *decl) {
@@ -543,7 +554,7 @@ bool HasCallableCopyConstructor(const clang::RecordDecl *decl) {
543554 return true ;
544555 }
545556 if (!cxx->hasUserDeclaredCopyConstructor ()) {
546- return !cxx-> defaultedCopyConstructorIsDeleted ( );
557+ return HasDefaultedCopyConstructor (cxx );
547558 }
548559 for (const auto *ctor : cxx->ctors ()) {
549560 if (ctor->isCopyConstructor () && !ctor->isDeleted () &&
0 commit comments