diff options
| author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2010-11-10 05:40:41 +0000 | 
|---|---|---|
| committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2010-11-10 05:40:41 +0000 | 
| commit | 2703bebc58f627a5cdf0bcb9bb205d8f552acf78 (patch) | |
| tree | bd2894642fa488a9afacbced39cb3d90d5139b89 /clang/lib/AST/DeclCXX.cpp | |
| parent | 66b291a41b7350cff3bdb86558a97c9c10ddfa46 (diff) | |
| download | bcm5719-llvm-2703bebc58f627a5cdf0bcb9bb205d8f552acf78.tar.gz bcm5719-llvm-2703bebc58f627a5cdf0bcb9bb205d8f552acf78.zip | |
Replace UsingDecl's SmallPtrSet of UsingShadowDecls with a linked list to avoid leaking memory.
Fixes rdar://8649963.
llvm-svn: 118674
Diffstat (limited to 'clang/lib/AST/DeclCXX.cpp')
| -rw-r--r-- | clang/lib/AST/DeclCXX.cpp | 38 | 
1 files changed, 38 insertions, 0 deletions
| diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp index bcb47baa24f..7679bf82441 100644 --- a/clang/lib/AST/DeclCXX.cpp +++ b/clang/lib/AST/DeclCXX.cpp @@ -1276,6 +1276,44 @@ NamespaceAliasDecl *NamespaceAliasDecl::Create(ASTContext &C, DeclContext *DC,                                      Qualifier, IdentLoc, Namespace);  } +UsingDecl *UsingShadowDecl::getUsingDecl() const { +  const UsingShadowDecl *Shadow = this; +  while (const UsingShadowDecl *NextShadow = +         dyn_cast<UsingShadowDecl>(Shadow->UsingOrNextShadow)) +    Shadow = NextShadow; +  return cast<UsingDecl>(Shadow->UsingOrNextShadow); +} + +void UsingDecl::addShadowDecl(UsingShadowDecl *S) { +  assert(std::find(shadow_begin(), shadow_end(), S) == shadow_end() && +         "declaration already in set"); +  assert(S->getUsingDecl() == this); + +  if (FirstUsingShadow) +    S->UsingOrNextShadow = FirstUsingShadow; +  FirstUsingShadow = S; +} + +void UsingDecl::removeShadowDecl(UsingShadowDecl *S) { +  assert(std::find(shadow_begin(), shadow_end(), S) != shadow_end() && +         "declaration not in set"); +  assert(S->getUsingDecl() == this); + +  // Remove S from the shadow decl chain. This is O(n) but hopefully rare. + +  if (FirstUsingShadow == S) { +    FirstUsingShadow = dyn_cast<UsingShadowDecl>(S->UsingOrNextShadow); +    S->UsingOrNextShadow = this; +    return; +  } + +  UsingShadowDecl *Prev = FirstUsingShadow; +  while (Prev->UsingOrNextShadow != S) +    Prev = cast<UsingShadowDecl>(Prev->UsingOrNextShadow); +  Prev->UsingOrNextShadow = S->UsingOrNextShadow; +  S->UsingOrNextShadow = this; +} +  UsingDecl *UsingDecl::Create(ASTContext &C, DeclContext *DC,                               SourceRange NNR, SourceLocation UL,                               NestedNameSpecifier* TargetNNS, | 

