@@ -2635,30 +2635,38 @@ namespace {
26352635 }
26362636 clang::CXXConstructorDecl *copyCtor = nullptr ;
26372637 clang::CXXConstructorDecl *moveCtor = nullptr ;
2638+ clang::CXXConstructorDecl *defaultCtor = nullptr ;
26382639 if (decl->needsImplicitCopyConstructor ()) {
26392640 copyCtor = clangSema.DeclareImplicitCopyConstructor (
26402641 const_cast <clang::CXXRecordDecl *>(decl));
2641- } else if (decl->needsImplicitMoveConstructor ()) {
2642+ }
2643+ if (decl->needsImplicitMoveConstructor ()) {
26422644 moveCtor = clangSema.DeclareImplicitMoveConstructor (
26432645 const_cast <clang::CXXRecordDecl *>(decl));
2644- } else {
2645- // We may have a defaulted copy constructor that needs to be defined.
2646- // Try to find it.
2647- for (auto methods : decl->methods ()) {
2648- if (auto declCtor = dyn_cast<clang::CXXConstructorDecl>(methods)) {
2649- if (declCtor->isDefaulted () &&
2650- declCtor->getAccess () == clang::AS_public &&
2651- !declCtor->isDeleted () &&
2652- // Note: we use "doesThisDeclarationHaveABody" here because
2653- // that's what "DefineImplicitCopyConstructor" checks.
2654- !declCtor->doesThisDeclarationHaveABody ()) {
2655- if (declCtor->isCopyConstructor ()) {
2646+ }
2647+ if (decl->needsImplicitDefaultConstructor ()) {
2648+ defaultCtor = clangSema.DeclareImplicitDefaultConstructor (
2649+ const_cast <clang::CXXRecordDecl *>(decl));
2650+ }
2651+ // We may have a defaulted copy/move/default constructor that needs to
2652+ // be defined. Try to find it.
2653+ for (auto methods : decl->methods ()) {
2654+ if (auto declCtor = dyn_cast<clang::CXXConstructorDecl>(methods)) {
2655+ if (declCtor->isDefaulted () &&
2656+ declCtor->getAccess () == clang::AS_public &&
2657+ !declCtor->isDeleted () &&
2658+ // Note: we use "doesThisDeclarationHaveABody" here because
2659+ // that's what "DefineImplicitCopyConstructor" checks.
2660+ !declCtor->doesThisDeclarationHaveABody ()) {
2661+ if (declCtor->isCopyConstructor ()) {
2662+ if (!copyCtor)
26562663 copyCtor = declCtor;
2657- break ;
2658- } else if (declCtor-> isMoveConstructor ()) {
2664+ } else if (declCtor-> isMoveConstructor ()) {
2665+ if (!moveCtor)
26592666 moveCtor = declCtor;
2660- break ;
2661- }
2667+ } else if (declCtor->isDefaultConstructor ()) {
2668+ if (!defaultCtor)
2669+ defaultCtor = declCtor;
26622670 }
26632671 }
26642672 }
@@ -2671,6 +2679,10 @@ namespace {
26712679 clangSema.DefineImplicitMoveConstructor (clang::SourceLocation (),
26722680 moveCtor);
26732681 }
2682+ if (defaultCtor) {
2683+ clangSema.DefineImplicitDefaultConstructor (clang::SourceLocation (),
2684+ defaultCtor);
2685+ }
26742686
26752687 if (decl->needsImplicitDestructor ()) {
26762688 auto dtor = clangSema.DeclareImplicitDestructor (
0 commit comments