blob: eef55d31947725ef916621be2deed50cf43e2c70 [file] [log] [blame]
John McCall8fb0d9d2011-05-01 22:35:37 +00001//===- Scope.cpp - Lexical scope information --------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the Scope class, which is used for recording
11// information about a lexical scope.
12//
13//===----------------------------------------------------------------------===//
14
15#include "clang/Sema/Scope.h"
16
17using namespace clang;
18
19void Scope::Init(Scope *parent, unsigned flags) {
20 AnyParent = parent;
21 Flags = flags;
Richard Smith1002d102012-02-17 01:35:32 +000022
23 if (parent && !(flags & FnScope)) {
24 BreakParent = parent->BreakParent;
25 ContinueParent = parent->ContinueParent;
26 } else {
27 // Control scopes do not contain the contents of nested function scopes for
28 // control flow purposes.
29 BreakParent = ContinueParent = 0;
30 }
31
John McCall8fb0d9d2011-05-01 22:35:37 +000032 if (parent) {
33 Depth = parent->Depth + 1;
34 PrototypeDepth = parent->PrototypeDepth;
35 PrototypeIndex = 0;
36 FnParent = parent->FnParent;
John McCall8fb0d9d2011-05-01 22:35:37 +000037 BlockParent = parent->BlockParent;
38 TemplateParamParent = parent->TemplateParamParent;
39 } else {
40 Depth = 0;
41 PrototypeDepth = 0;
42 PrototypeIndex = 0;
Richard Smith1002d102012-02-17 01:35:32 +000043 FnParent = BlockParent = 0;
John McCall8fb0d9d2011-05-01 22:35:37 +000044 TemplateParamParent = 0;
45 }
46
47 // If this scope is a function or contains breaks/continues, remember it.
48 if (flags & FnScope) FnParent = this;
49 if (flags & BreakScope) BreakParent = this;
50 if (flags & ContinueScope) ContinueParent = this;
John McCall8fb0d9d2011-05-01 22:35:37 +000051 if (flags & BlockScope) BlockParent = this;
52 if (flags & TemplateParamScope) TemplateParamParent = this;
53
54 // If this is a prototype scope, record that.
55 if (flags & FunctionPrototypeScope) PrototypeDepth++;
56
57 DeclsInScope.clear();
58 UsingDirectives.clear();
59 Entity = 0;
60 ErrorTrap.reset();
61}
James Molloy6f8780b2012-02-29 10:24:19 +000062
63bool Scope::containedInPrototypeScope() const {
64 const Scope *S = this;
65 while (S) {
66 if (S->isFunctionPrototypeScope())
67 return true;
68 S = S->getParent();
69 }
70 return false;
71}
Serge Pavlov09f99242014-01-23 15:05:00 +000072
73void Scope::AddFlags(unsigned FlagsToSet) {
74 assert((FlagsToSet & ~(BreakScope | ContinueScope)) == 0 &&
75 "Unsupported scope flags");
76 if (FlagsToSet & BreakScope) {
77 assert((Flags & BreakScope) == 0 && "Already set");
78 BreakParent = this;
79 }
80 if (FlagsToSet & ContinueScope) {
81 assert((Flags & ContinueScope) == 0 && "Already set");
82 ContinueParent = this;
83 }
84 Flags |= FlagsToSet;
85}
86