|  | //===- Scope.cpp - Lexical scope information --------------------*- C++ -*-===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // This file implements the Scope class, which is used for recording | 
|  | // information about a lexical scope. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "clang/Sema/Scope.h" | 
|  |  | 
|  | using namespace clang; | 
|  |  | 
|  | void Scope::Init(Scope *parent, unsigned flags) { | 
|  | AnyParent = parent; | 
|  | Flags = flags; | 
|  |  | 
|  | if (parent && !(flags & FnScope)) { | 
|  | BreakParent    = parent->BreakParent; | 
|  | ContinueParent = parent->ContinueParent; | 
|  | } else { | 
|  | // Control scopes do not contain the contents of nested function scopes for | 
|  | // control flow purposes. | 
|  | BreakParent = ContinueParent = 0; | 
|  | } | 
|  |  | 
|  | if (parent) { | 
|  | Depth = parent->Depth + 1; | 
|  | PrototypeDepth = parent->PrototypeDepth; | 
|  | PrototypeIndex = 0; | 
|  | FnParent       = parent->FnParent; | 
|  | BlockParent    = parent->BlockParent; | 
|  | TemplateParamParent = parent->TemplateParamParent; | 
|  | } else { | 
|  | Depth = 0; | 
|  | PrototypeDepth = 0; | 
|  | PrototypeIndex = 0; | 
|  | FnParent = BlockParent = 0; | 
|  | TemplateParamParent = 0; | 
|  | } | 
|  |  | 
|  | // If this scope is a function or contains breaks/continues, remember it. | 
|  | if (flags & FnScope)            FnParent = this; | 
|  | if (flags & BreakScope)         BreakParent = this; | 
|  | if (flags & ContinueScope)      ContinueParent = this; | 
|  | if (flags & BlockScope)         BlockParent = this; | 
|  | if (flags & TemplateParamScope) TemplateParamParent = this; | 
|  |  | 
|  | // If this is a prototype scope, record that. | 
|  | if (flags & FunctionPrototypeScope) PrototypeDepth++; | 
|  |  | 
|  | DeclsInScope.clear(); | 
|  | UsingDirectives.clear(); | 
|  | Entity = 0; | 
|  | ErrorTrap.reset(); | 
|  | } | 
|  |  | 
|  | bool Scope::containedInPrototypeScope() const { | 
|  | const Scope *S = this; | 
|  | while (S) { | 
|  | if (S->isFunctionPrototypeScope()) | 
|  | return true; | 
|  | S = S->getParent(); | 
|  | } | 
|  | return false; | 
|  | } |