@@ -2635,30 +2635,38 @@ namespace {
2635
2635
}
2636
2636
clang::CXXConstructorDecl *copyCtor = nullptr ;
2637
2637
clang::CXXConstructorDecl *moveCtor = nullptr ;
2638
+ clang::CXXConstructorDecl *defaultCtor = nullptr ;
2638
2639
if (decl->needsImplicitCopyConstructor ()) {
2639
2640
copyCtor = clangSema.DeclareImplicitCopyConstructor (
2640
2641
const_cast <clang::CXXRecordDecl *>(decl));
2641
- } else if (decl->needsImplicitMoveConstructor ()) {
2642
+ }
2643
+ if (decl->needsImplicitMoveConstructor ()) {
2642
2644
moveCtor = clangSema.DeclareImplicitMoveConstructor (
2643
2645
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)
2656
2663
copyCtor = declCtor;
2657
- break ;
2658
- } else if (declCtor-> isMoveConstructor ()) {
2664
+ } else if (declCtor-> isMoveConstructor ()) {
2665
+ if (!moveCtor)
2659
2666
moveCtor = declCtor;
2660
- break ;
2661
- }
2667
+ } else if (declCtor->isDefaultConstructor ()) {
2668
+ if (!defaultCtor)
2669
+ defaultCtor = declCtor;
2662
2670
}
2663
2671
}
2664
2672
}
@@ -2671,6 +2679,10 @@ namespace {
2671
2679
clangSema.DefineImplicitMoveConstructor (clang::SourceLocation (),
2672
2680
moveCtor);
2673
2681
}
2682
+ if (defaultCtor) {
2683
+ clangSema.DefineImplicitDefaultConstructor (clang::SourceLocation (),
2684
+ defaultCtor);
2685
+ }
2674
2686
2675
2687
if (decl->needsImplicitDestructor ()) {
2676
2688
auto dtor = clangSema.DeclareImplicitDestructor (
0 commit comments