@@ -508,11 +508,11 @@ bool HasDefaultedCopyConstructor(const clang::RecordDecl *decl) {
508508 return true ;
509509 }
510510 for (const auto *ctor : cxx->ctors ()) {
511- if (ctor->isCopyConstructor ()) {
512- return !ctor-> isUserProvided () && !ctor-> isDeleted () ;
511+ if (ctor->isCopyConstructor () && ctor-> isUserProvided () ) {
512+ return false ;
513513 }
514514 }
515- return !cxx-> defaultedCopyConstructorIsDeleted ( );
515+ return HasCallableCopyConstructor (cxx );
516516}
517517
518518bool RecordHasOnlyReferenceFields (const clang::RecordDecl *decl) {
@@ -542,16 +542,21 @@ bool HasCallableCopyConstructor(const clang::RecordDecl *decl) {
542542 if (!cxx) {
543543 return true ;
544544 }
545- if (!cxx->hasUserDeclaredCopyConstructor ()) {
546- return !cxx->defaultedCopyConstructorIsDeleted ();
545+ if (cxx->hasUserDeclaredCopyConstructor ()) {
546+ return std::ranges::any_of (cxx->ctors (), [](const auto *ctor) {
547+ return ctor->isCopyConstructor () && !ctor->isDeleted () &&
548+ ctor->getDefinition ();
549+ });
547550 }
548- for (const auto *ctor : cxx->ctors ()) {
549- if (ctor->isCopyConstructor () && !ctor->isDeleted () &&
550- ctor->getDefinition ()) {
551- return true ;
552- }
551+ if (cxx->defaultedCopyConstructorIsDeleted ()) {
552+ return false ;
553553 }
554- return false ;
554+ auto &ctx = cxx->getASTContext ();
555+ return std::ranges::all_of (cxx->fields (), [&](const clang::FieldDecl *f) {
556+ auto *record = ctx.getBaseElementType (f->getType ())->getAsCXXRecordDecl ();
557+ return !record || !IsUserDefinedDecl (record) ||
558+ HasCallableCopyConstructor (record);
559+ });
555560}
556561
557562bool IsRValueConvertingConstructor (const clang::CXXConstructorDecl *ctor) {
0 commit comments