blob: 10f12ce844f8de9c77e41de63876a5f23047bc4a [file] [log] [blame]
John McCallfb44de92011-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 Smith85b29a42012-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 McCallfb44de92011-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 McCallfb44de92011-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 Smith85b29a42012-02-17 01:35:32 +000043 FnParent = BlockParent = 0;
John McCallfb44de92011-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 McCallfb44de92011-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 Molloy16f1f712012-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}