@@ -2634,30 +2634,38 @@ namespace {
2634
2634
}
2635
2635
clang::CXXConstructorDecl *copyCtor = nullptr ;
2636
2636
clang::CXXConstructorDecl *moveCtor = nullptr ;
2637
+ clang::CXXConstructorDecl *defaultCtor = nullptr ;
2637
2638
if (decl->needsImplicitCopyConstructor ()) {
2638
2639
copyCtor = clangSema.DeclareImplicitCopyConstructor (
2639
2640
const_cast <clang::CXXRecordDecl *>(decl));
2640
- } else if (decl->needsImplicitMoveConstructor ()) {
2641
+ }
2642
+ if (decl->needsImplicitMoveConstructor ()) {
2641
2643
moveCtor = clangSema.DeclareImplicitMoveConstructor (
2642
2644
const_cast <clang::CXXRecordDecl *>(decl));
2643
- } else {
2644
- // We may have a defaulted copy constructor that needs to be defined.
2645
- // Try to find it.
2646
- for (auto methods : decl->methods ()) {
2647
- if (auto declCtor = dyn_cast<clang::CXXConstructorDecl>(methods)) {
2648
- if (declCtor->isDefaulted () &&
2649
- declCtor->getAccess () == clang::AS_public &&
2650
- !declCtor->isDeleted () &&
2651
- // Note: we use "doesThisDeclarationHaveABody" here because
2652
- // that's what "DefineImplicitCopyConstructor" checks.
2653
- !declCtor->doesThisDeclarationHaveABody ()) {
2654
- if (declCtor->isCopyConstructor ()) {
2645
+ }
2646
+ if (decl->needsImplicitDefaultConstructor ()) {
2647
+ defaultCtor = clangSema.DeclareImplicitDefaultConstructor (
2648
+ const_cast <clang::CXXRecordDecl *>(decl));
2649
+ }
2650
+ // We may have a defaulted copy/move/default constructor that needs to
2651
+ // be defined. Try to find it.
2652
+ for (auto methods : decl->methods ()) {
2653
+ if (auto declCtor = dyn_cast<clang::CXXConstructorDecl>(methods)) {
2654
+ if (declCtor->isDefaulted () &&
2655
+ declCtor->getAccess () == clang::AS_public &&
2656
+ !declCtor->isDeleted () &&
2657
+ // Note: we use "doesThisDeclarationHaveABody" here because
2658
+ // that's what "DefineImplicitCopyConstructor" checks.
2659
+ !declCtor->doesThisDeclarationHaveABody ()) {
2660
+ if (declCtor->isCopyConstructor ()) {
2661
+ if (!copyCtor)
2655
2662
copyCtor = declCtor;
2656
- break ;
2657
- } else if (declCtor-> isMoveConstructor ()) {
2663
+ } else if (declCtor-> isMoveConstructor ()) {
2664
+ if (!moveCtor)
2658
2665
moveCtor = declCtor;
2659
- break ;
2660
- }
2666
+ } else if (declCtor->isDefaultConstructor ()) {
2667
+ if (!defaultCtor)
2668
+ defaultCtor = declCtor;
2661
2669
}
2662
2670
}
2663
2671
}
@@ -2670,6 +2678,10 @@ namespace {
2670
2678
clangSema.DefineImplicitMoveConstructor (clang::SourceLocation (),
2671
2679
moveCtor);
2672
2680
}
2681
+ if (defaultCtor) {
2682
+ clangSema.DefineImplicitDefaultConstructor (clang::SourceLocation (),
2683
+ defaultCtor);
2684
+ }
2673
2685
2674
2686
if (decl->needsImplicitDestructor ()) {
2675
2687
auto dtor = clangSema.DeclareImplicitDestructor (
0 commit comments