Scope.cpp revision 16f1f717af196b1448258857b2e6dcfe144b39d0
1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//===- Scope.cpp - Lexical scope information --------------------*- C++ -*-===// 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// The LLVM Compiler Infrastructure 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// This file is distributed under the University of Illinois Open Source 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// License. See LICENSE.TXT for details. 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//===----------------------------------------------------------------------===// 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// This file implements the Scope class, which is used for recording 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// information about a lexical scope. 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver//===----------------------------------------------------------------------===// 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include "clang/Sema/Scope.h" 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverusing namespace clang; 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervoid Scope::Init(Scope *parent, unsigned flags) { 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver AnyParent = parent; 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Flags = flags; 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (parent && !(flags & FnScope)) { 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver BreakParent = parent->BreakParent; 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ContinueParent = parent->ContinueParent; 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } else { 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Control scopes do not contain the contents of nested function scopes for 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // control flow purposes. 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver BreakParent = ContinueParent = 0; 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (parent) { 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Depth = parent->Depth + 1; 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver PrototypeDepth = parent->PrototypeDepth; 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver PrototypeIndex = 0; 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FnParent = parent->FnParent; 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver BlockParent = parent->BlockParent; 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TemplateParamParent = parent->TemplateParamParent; 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } else { 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Depth = 0; 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver PrototypeDepth = 0; 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver PrototypeIndex = 0; 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FnParent = BlockParent = 0; 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TemplateParamParent = 0; 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // If this scope is a function or contains breaks/continues, remember it. 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (flags & FnScope) FnParent = this; 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (flags & BreakScope) BreakParent = this; 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (flags & ContinueScope) ContinueParent = this; 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (flags & BlockScope) BlockParent = this; 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (flags & TemplateParamScope) TemplateParamParent = this; 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // If this is a prototype scope, record that. 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (flags & FunctionPrototypeScope) PrototypeDepth++; 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver DeclsInScope.clear(); 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver UsingDirectives.clear(); 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Entity = 0; 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorTrap.reset(); 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverbool Scope::containedInPrototypeScope() const { 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver const Scope *S = this; 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while (S) { 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (S->isFunctionPrototypeScope()) 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return true; 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver S = S->getParent(); 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return false; 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver