diff options
| author | John McCall <rjmccall@apple.com> | 2011-02-22 22:25:23 +0000 |
|---|---|---|
| committer | John McCall <rjmccall@apple.com> | 2011-02-22 22:25:23 +0000 |
| commit | b67608fe83cea48f4ea586ebb3ecfbc961596ae3 (patch) | |
| tree | 6b23a9b9982015eb54d2872c520e5ab53402decf /clang/lib | |
| parent | 2d1f4be47a59f7d44b4b099154f9a5c440360185 (diff) | |
| download | bcm5719-llvm-b67608fe83cea48f4ea586ebb3ecfbc961596ae3.tar.gz bcm5719-llvm-b67608fe83cea48f4ea586ebb3ecfbc961596ae3.zip | |
Provide a Decl::getNonClosureContext to look through any "closure" (i.e.
block and, eventually, C++ lambda) contexts.
llvm-svn: 126252
Diffstat (limited to 'clang/lib')
| -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 |

