aboutsummaryrefslogtreecommitdiff
path: root/lib/AST/Decl.cpp
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2009-07-14 03:20:08 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2009-07-14 03:20:08 +0000
commit03d5e3d03117a56097cea98f53198fb20de1eb35 (patch)
tree8bfbd5fa23a4c894a55dd2947b9e3995cde5e442 /lib/AST/Decl.cpp
parent7bf792fdde4641d865eba4a068d862d5300bd1e4 (diff)
Introduce FunctionDecl::getLatestDeclaration() and VarDecl::getLatestDeclaration().
For multiple redeclarations they return the last one. Also, add some non const versions of methods. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@75603 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/Decl.cpp')
-rw-r--r--lib/AST/Decl.cpp46
1 files changed, 39 insertions, 7 deletions
diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp
index 5ef0c09093..ae1df92012 100644
--- a/lib/AST/Decl.cpp
+++ b/lib/AST/Decl.cpp
@@ -358,8 +358,25 @@ const Expr *VarDecl::getDefinition(const VarDecl *&Def) const {
return Def? Def->getInit() : 0;
}
-const VarDecl *VarDecl::getFirstDeclaration() const {
- const VarDecl *First = this;
+void VarDecl::setPreviousDeclaration(VarDecl *PrevDecl) {
+ if (PrevDecl) {
+ // Point to previous.
+ PreviousDeclaration.setPointer(PrevDecl);
+ PreviousDeclaration.setInt(0);
+
+ // First one will point to this one as latest.
+ VarDecl *First = PrevDecl->getFirstDeclaration();
+ assert(First->PreviousDeclaration.getInt() == 1 && "Expected first");
+ First->PreviousDeclaration.setPointer(this);
+ } else {
+ // This is first.
+ PreviousDeclaration.setPointer(this);
+ PreviousDeclaration.setInt(1);
+ }
+}
+
+VarDecl *VarDecl::getFirstDeclaration() {
+ VarDecl *First = this;
while (First->getPreviousDeclaration())
First = First->getPreviousDeclaration();
@@ -388,7 +405,8 @@ void FunctionDecl::Destroy(ASTContext& C) {
Stmt *FunctionDecl::getBody(const FunctionDecl *&Definition) const {
- for (const FunctionDecl *FD = this; FD != 0; FD = FD->PreviousDeclaration) {
+ for (const FunctionDecl *FD = this;
+ FD != 0; FD = FD->getPreviousDeclaration()) {
if (FD->Body) {
Definition = FD;
return FD->Body.get(getASTContext().getExternalSource());
@@ -399,7 +417,8 @@ Stmt *FunctionDecl::getBody(const FunctionDecl *&Definition) const {
}
Stmt *FunctionDecl::getBodyIfAvailable() const {
- for (const FunctionDecl *FD = this; FD != 0; FD = FD->PreviousDeclaration) {
+ for (const FunctionDecl *FD = this;
+ FD != 0; FD = FD->getPreviousDeclaration()) {
if (FD->Body && !FD->Body.isOffset()) {
return FD->Body.get(0);
}
@@ -571,7 +590,20 @@ bool FunctionDecl::isExternGNUInline(ASTContext &Context) const {
void
FunctionDecl::setPreviousDeclaration(FunctionDecl *PrevDecl) {
- PreviousDeclaration = PrevDecl;
+ if (PrevDecl) {
+ // Point to previous.
+ PreviousDeclaration.setPointer(PrevDecl);
+ PreviousDeclaration.setInt(0);
+
+ // First one will point to this one as latest.
+ FunctionDecl *First = PrevDecl->getFirstDeclaration();
+ assert(First->PreviousDeclaration.getInt() == 1 && "Expected first");
+ First->PreviousDeclaration.setPointer(this);
+ } else {
+ // This is first.
+ PreviousDeclaration.setPointer(this);
+ PreviousDeclaration.setInt(1);
+ }
if (FunctionTemplateDecl *FunTmpl = getDescribedFunctionTemplate()) {
FunctionTemplateDecl *PrevFunTmpl
@@ -581,8 +613,8 @@ FunctionDecl::setPreviousDeclaration(FunctionDecl *PrevDecl) {
}
}
-const FunctionDecl *FunctionDecl::getFirstDeclaration() const {
- const FunctionDecl *First = this;
+FunctionDecl *FunctionDecl::getFirstDeclaration() {
+ FunctionDecl *First = this;
while (First->getPreviousDeclaration())
First = First->getPreviousDeclaration();