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.

llvm-svn: 131515
This commit is contained in:
Alexis Hunt 2011-05-18 01:06:45 +00:00
parent c2bf9e1851
commit 2430a6fb91
1 changed files with 9 additions and 1 deletions

View File

@ -2997,6 +2997,12 @@ void Sema::CheckCompletedCXXClass(CXXRecordDecl *Record) {
// have inherited constructors. // have inherited constructors.
DeclareInheritedConstructors(Record); 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); CheckExplicitlyDefaultedMethods(Record);
} }
@ -3454,8 +3460,10 @@ bool Sema::ShouldDeleteDefaultConstructor(CXXConstructorDecl *CD) {
} }
bool Sema::ShouldDeleteCopyConstructor(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->isDependentType() && "do deletion after instantiation");
assert(RD);
assert(CD->getParent() == RD);
if (!LangOpts.CPlusPlus0x) if (!LangOpts.CPlusPlus0x)
return false; return false;