@@ -678,7 +678,10 @@ bool HasCallableCopyConstructor(const clang::RecordDecl *decl) {
678678 ctor->getDefinition ();
679679 });
680680 }
681- if (cxx->defaultedCopyConstructorIsDeleted ()) {
681+ if (cxx->defaultedCopyConstructorIsDeleted () ||
682+ std::ranges::any_of (cxx->ctors (), [](const auto *ctor) {
683+ return ctor->isCopyConstructor () && ctor->isDeleted ();
684+ })) {
682685 return false ;
683686 }
684687 auto &ctx = cxx->getASTContext ();
@@ -1607,27 +1610,48 @@ void DefineImplicitMembers(clang::Sema &sema, clang::CXXRecordDecl *decl) {
16071610 tu_scope.setEntity (sema.Context .getTranslationUnitDecl ());
16081611 auto *saved_tu_scope = std::exchange (sema.TUScope , &tu_scope);
16091612 sema.ForceDeclarationOfImplicitMembers (decl);
1613+ auto define = [&](clang::FunctionDecl *fn, auto &&definer) {
1614+ RuleDecls::Trial trial (sema);
1615+ clang::DiagnosticErrorTrap errors (sema.getDiagnostics ());
1616+ {
1617+ clang::Sema::GlobalEagerInstantiationScope instantiations (
1618+ sema, /* Enabled=*/ true , /* AtEndOfTU=*/ false );
1619+ definer ();
1620+ instantiations.perform ();
1621+ }
1622+ if (trial.failed () || errors.hasErrorOccurred ()) {
1623+ fn->setDeletedAsWritten (true );
1624+ }
1625+ };
16101626 for (auto ctor : decl->ctors ()) {
16111627 if (ctor->isCopyConstructor () && ctor->isImplicit () &&
16121628 !ctor->doesThisDeclarationHaveABody () && !ctor->isDeleted ()) {
1613- sema.DefineImplicitCopyConstructor (decl->getLocation (), ctor);
1629+ define (ctor, [&] {
1630+ sema.DefineImplicitCopyConstructor (decl->getLocation (), ctor);
1631+ });
16141632 }
16151633 if (ctor->isMoveConstructor () && !ctor->isUserProvided () &&
16161634 !ctor->doesThisDeclarationHaveABody () && !ctor->isDeleted () &&
16171635 !HasDefaultedCopyConstructor (decl)) {
1618- sema.DefineImplicitMoveConstructor (decl->getLocation (), ctor);
1636+ define (ctor, [&] {
1637+ sema.DefineImplicitMoveConstructor (decl->getLocation (), ctor);
1638+ });
16191639 }
16201640 }
16211641 for (auto *method : decl->methods ()) {
16221642 if (method->isMoveAssignmentOperator () && !method->isUserProvided () &&
16231643 !method->doesThisDeclarationHaveABody () && !method->isDeleted () &&
16241644 !HasDefaultedCopyAssignment (decl)) {
1625- sema.DefineImplicitMoveAssignment (decl->getLocation (), method);
1645+ define (method, [&] {
1646+ sema.DefineImplicitMoveAssignment (decl->getLocation (), method);
1647+ });
16261648 }
16271649 if (method->isCopyAssignmentOperator () && !method->isUserProvided () &&
16281650 !method->doesThisDeclarationHaveABody () && !method->isDeleted () &&
16291651 NeedsDefaultedCopyAssignment (decl)) {
1630- sema.DefineImplicitCopyAssignment (decl->getLocation (), method);
1652+ define (method, [&] {
1653+ sema.DefineImplicitCopyAssignment (decl->getLocation (), method);
1654+ });
16311655 }
16321656 }
16331657 auto define_defaulted_comparison = [&](clang::FunctionDecl *fn) {
@@ -1640,7 +1664,9 @@ void DefineImplicitMembers(clang::Sema &sema, clang::CXXRecordDecl *decl) {
16401664#else
16411665 auto kind = sema.getDefaultedComparisonKind (fn);
16421666#endif
1643- sema.DefineDefaultedComparison (decl->getLocation (), fn, kind);
1667+ define (fn, [&] {
1668+ sema.DefineDefaultedComparison (decl->getLocation (), fn, kind);
1669+ });
16441670 };
16451671 for (auto *method : decl->methods ()) {
16461672 define_defaulted_comparison (method);
0 commit comments