From d02fec890e147a7726410108d4b1d74a842fc9ff Mon Sep 17 00:00:00 2001 From: Sean Hunt Date: Wed, 18 May 2011 01:06:45 +0000 Subject: [PATCH] Force declaration of implicit members in C++0x mode. I hear at least one person crying out in anguish, but it's unfortunately necessary to avoid infinite loops with mutually dependent constructors trying to call each other and determine if they are deleted. It might be possible to go back to the old behavior if we can implement part-of-file lookups efficiently, or if a solution is discovered by which we can safely detect and avoid infinite recusion. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@131515 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaDeclCXX.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 406f4df16f..f1b03ff9c7 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -2997,6 +2997,12 @@ void Sema::CheckCompletedCXXClass(CXXRecordDecl *Record) { // have inherited constructors. DeclareInheritedConstructors(Record); + // Unfortunately, in C++0x mode, we additionally have to declare all + // implicit members in order to ensure we don't get a horrible evil bad + // infinite recursion from ShouldDelete* + if (getLangOptions().CPlusPlus0x) + ForceDeclarationOfImplicitMembers(Record); + CheckExplicitlyDefaultedMethods(Record); } @@ -3454,8 +3460,10 @@ bool Sema::ShouldDeleteDefaultConstructor(CXXConstructorDecl *CD) { } bool Sema::ShouldDeleteCopyConstructor(CXXConstructorDecl *CD) { - CXXRecordDecl *RD = CD->getParent(); + CXXRecordDecl *RD = CD->getParent()->getDefinition(); assert(!RD->isDependentType() && "do deletion after instantiation"); + assert(RD); + assert(CD->getParent() == RD); if (!LangOpts.CPlusPlus0x) return false; -- 2.50.1