@@ -1636,27 +1636,42 @@ void DefineImplicitMembers(clang::Sema &sema, clang::CXXRecordDecl *decl) {
16361636 tu_scope.setEntity (sema.Context .getTranslationUnitDecl ());
16371637 auto *saved_tu_scope = std::exchange (sema.TUScope , &tu_scope);
16381638 sema.ForceDeclarationOfImplicitMembers (decl);
1639+ auto define = [&](clang::FunctionDecl *fn, auto &&definer) {
1640+ RuleDecls::Trial trial (sema);
1641+ definer ();
1642+ if (trial.failed ()) {
1643+ fn->setDeletedAsWritten (true );
1644+ }
1645+ };
16391646 for (auto ctor : decl->ctors ()) {
16401647 if (ctor->isCopyConstructor () && ctor->isImplicit () &&
16411648 !ctor->doesThisDeclarationHaveABody () && !ctor->isDeleted ()) {
1642- sema.DefineImplicitCopyConstructor (decl->getLocation (), ctor);
1649+ define (ctor, [&] {
1650+ sema.DefineImplicitCopyConstructor (decl->getLocation (), ctor);
1651+ });
16431652 }
16441653 if (ctor->isMoveConstructor () && !ctor->isUserProvided () &&
16451654 !ctor->doesThisDeclarationHaveABody () && !ctor->isDeleted () &&
16461655 !HasDefaultedCopyConstructor (decl)) {
1647- sema.DefineImplicitMoveConstructor (decl->getLocation (), ctor);
1656+ define (ctor, [&] {
1657+ sema.DefineImplicitMoveConstructor (decl->getLocation (), ctor);
1658+ });
16481659 }
16491660 }
16501661 for (auto *method : decl->methods ()) {
16511662 if (method->isMoveAssignmentOperator () && !method->isUserProvided () &&
16521663 !method->doesThisDeclarationHaveABody () && !method->isDeleted () &&
16531664 !HasDefaultedCopyAssignment (decl)) {
1654- sema.DefineImplicitMoveAssignment (decl->getLocation (), method);
1665+ define (method, [&] {
1666+ sema.DefineImplicitMoveAssignment (decl->getLocation (), method);
1667+ });
16551668 }
16561669 if (method->isCopyAssignmentOperator () && !method->isUserProvided () &&
16571670 !method->doesThisDeclarationHaveABody () && !method->isDeleted () &&
16581671 NeedsDefaultedCopyAssignment (decl)) {
1659- sema.DefineImplicitCopyAssignment (decl->getLocation (), method);
1672+ define (method, [&] {
1673+ sema.DefineImplicitCopyAssignment (decl->getLocation (), method);
1674+ });
16601675 }
16611676 }
16621677 auto define_defaulted_comparison = [&](clang::FunctionDecl *fn) {
@@ -1669,7 +1684,9 @@ void DefineImplicitMembers(clang::Sema &sema, clang::CXXRecordDecl *decl) {
16691684#else
16701685 auto kind = sema.getDefaultedComparisonKind (fn);
16711686#endif
1672- sema.DefineDefaultedComparison (decl->getLocation (), fn, kind);
1687+ define (fn, [&] {
1688+ sema.DefineDefaultedComparison (decl->getLocation (), fn, kind);
1689+ });
16731690 };
16741691 for (auto *method : decl->methods ()) {
16751692 define_defaulted_comparison (method);
0 commit comments