]> granicus.if.org Git - clang/commitdiff
Force declaration of implicit members in C++0x mode.
authorSean Hunt <scshunt@csclub.uwaterloo.ca>
Wed, 18 May 2011 01:06:45 +0000 (01:06 +0000)
committerSean Hunt <scshunt@csclub.uwaterloo.ca>
Wed, 18 May 2011 01:06:45 +0000 (01:06 +0000)
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

index 406f4df16f7004dd2a785c0e01cbd8ac94975d72..f1b03ff9c737d573c1478d5603af2fa8e07b4a44 100644 (file)
@@ -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;