diff options
Diffstat (limited to 'clang/lib/CodeGen/CodeGenFunction.cpp')
-rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.cpp | 37 |
1 files changed, 23 insertions, 14 deletions
diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp index 72009daef68..f9e54b75708 100644 --- a/clang/lib/CodeGen/CodeGenFunction.cpp +++ b/clang/lib/CodeGen/CodeGenFunction.cpp @@ -239,28 +239,37 @@ void CodeGenFunction::GenerateCode(GlobalDecl GD, if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(FD)) EmitDtorEpilogue(DD, GD.getDtorType()); FinishFunction(S->getRBracLoc()); - } - else + } else if (FD->isImplicit()) { + const CXXRecordDecl *ClassDecl = + cast<CXXRecordDecl>(FD->getDeclContext()); + (void) ClassDecl; if (const CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(FD)) { - const CXXRecordDecl *ClassDecl = - cast<CXXRecordDecl>(CD->getDeclContext()); - (void) ClassDecl; + // FIXME: For C++0x, we want to look for implicit *definitions* of + // these special member functions, rather than implicit *declarations*. if (CD->isCopyConstructor(getContext())) { assert(!ClassDecl->hasUserDeclaredCopyConstructor() && - "bogus constructor is being synthesize"); + "Cannot synthesize a non-implicit copy constructor"); SynthesizeCXXCopyConstructor(CD, GD.getCtorType(), Fn, Args); - } - else { + } else if (CD->isDefaultConstructor()) { assert(!ClassDecl->hasUserDeclaredConstructor() && - "bogus constructor is being synthesize"); + "Cannot synthesize a non-implicit default constructor."); SynthesizeDefaultConstructor(CD, GD.getCtorType(), Fn, Args); + } else { + assert(false && "Implicit constructor cannot be synthesized"); } - } - else if (const CXXDestructorDecl *CD = dyn_cast<CXXDestructorDecl>(FD)) - SynthesizeDefaultDestructor(CD, GD.getDtorType(), Fn, Args); - else if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) { - if (MD->isCopyAssignment()) + } else if (const CXXDestructorDecl *CD = dyn_cast<CXXDestructorDecl>(FD)) { + assert(!ClassDecl->hasUserDeclaredDestructor() && + "Cannot synthesize a non-implicit destructor"); + SynthesizeDefaultDestructor(CD, GD.getDtorType(), Fn, Args); + } else if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) { + assert(MD->isCopyAssignment() && + !ClassDecl->hasUserDeclaredCopyAssignment() && + "Cannot synthesize a method that is not an implicit-defined " + "copy constructor"); SynthesizeCXXCopyAssignment(MD, Fn, Args); + } else { + assert(false && "Cannot synthesize unknown implicit function"); + } } // Destroy the 'this' declaration. |