diff options
author | John McCall <rjmccall@apple.com> | 2010-03-26 21:56:38 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2010-03-26 21:56:38 +0000 |
commit | 2243288c4826905b5a0837f6f21d9d821688652e (patch) | |
tree | 4b2e38e11def7a51eb0d89810004348cf4453753 /lib/AST/Decl.cpp | |
parent | 0fd8ff73630adab9a33123f23ef62fcf5c3cf326 (diff) |
Properly account for redeclarations when explicitly instantiating class templates.
What happens here is that we actually turn the first declaration into a
definition, regardless of whether it was actually originally a definition,
and furthermore we do this all after we've instantiated all the declarations.
This exposes a bug in my DefinitionData patch where it was only setting the
DefinitionData for previous declarations, not future declarations.
Fortunately, there's an iterator for that.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@99657 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/Decl.cpp')
-rw-r--r-- | lib/AST/Decl.cpp | 6 |
1 files changed, 2 insertions, 4 deletions
diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index 6c9a45ef6c..dc9fb59e30 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -1413,10 +1413,8 @@ void TagDecl::startDefinition() { CXXRecordDecl *D = cast<CXXRecordDecl>(this); struct CXXRecordDecl::DefinitionData *Data = new (getASTContext()) struct CXXRecordDecl::DefinitionData(D); - do { - D->DefinitionData = Data; - D = cast_or_null<CXXRecordDecl>(D->getPreviousDeclaration()); - } while (D); + for (redecl_iterator I = redecls_begin(), E = redecls_end(); I != E; ++I) + cast<CXXRecordDecl>(*I)->DefinitionData = Data; } } |