| //===- 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; | 
 | } |