diff options
Diffstat (limited to 'clang/lib/AST/DeclBase.cpp')
| -rw-r--r-- | clang/lib/AST/DeclBase.cpp | 16 | 
1 files changed, 16 insertions, 0 deletions
diff --git a/clang/lib/AST/DeclBase.cpp b/clang/lib/AST/DeclBase.cpp index be379d522dd..81df00d6c7e 100644 --- a/clang/lib/AST/DeclBase.cpp +++ b/clang/lib/AST/DeclBase.cpp @@ -465,6 +465,22 @@ void Decl::CheckAccessDeclContext() const {  #endif  } +DeclContext *Decl::getNonClosureContext() { +  DeclContext *DC = getDeclContext(); + +  // This is basically "while (DC->isClosure()) DC = DC->getParent();" +  // except that it's significantly more efficient to cast to a known +  // decl type and call getDeclContext() than to call getParent(). +  do { +    if (isa<BlockDecl>(DC)) { +      DC = cast<BlockDecl>(DC)->getDeclContext(); +      continue; +    } +  } while (false); + +  assert(!DC->isClosure()); +  return DC; +}  //===----------------------------------------------------------------------===//  // DeclContext Implementation  | 

