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