2011-05-02 06:35:37 +08:00
|
|
|
//===- 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;
|
2012-02-17 09:35:32 +08:00
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2011-05-02 06:35:37 +08:00
|
|
|
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;
|
2012-02-17 09:35:32 +08:00
|
|
|
FnParent = BlockParent = 0;
|
2011-05-02 06:35:37 +08:00
|
|
|
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();
|
|
|
|
}
|
2012-02-29 18:24:19 +08:00
|
|
|
|
|
|
|
bool Scope::containedInPrototypeScope() const {
|
|
|
|
const Scope *S = this;
|
|
|
|
while (S) {
|
|
|
|
if (S->isFunctionPrototypeScope())
|
|
|
|
return true;
|
|
|
|
S = S->getParent();
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|