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
diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp
index 5ef0c09..ae1df92 100644
--- a/lib/AST/Decl.cpp
+++ b/lib/AST/Decl.cpp
@@ -358,8 +358,25 @@
   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 @@
 
 
 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::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 @@
 
 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 @@
   }
 }
 
-const FunctionDecl *FunctionDecl::getFirstDeclaration() const {
-  const FunctionDecl *First = this;
+FunctionDecl *FunctionDecl::getFirstDeclaration() {
+  FunctionDecl *First = this;
   while (First->getPreviousDeclaration())
     First = First->getPreviousDeclaration();