-Add DeclChain member to DeclContext.
-ScopedDecls get chained to their DeclContext.
-DeclContext's DeclChain replaces FunctionDecl's DeclChain and EnumDecl's ElementList.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@52164 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/DeclSerialization.cpp b/lib/AST/DeclSerialization.cpp
index ca9a152..2ba8910 100644
--- a/lib/AST/DeclSerialization.cpp
+++ b/lib/AST/DeclSerialization.cpp
@@ -30,10 +30,13 @@
 void Decl::Emit(Serializer& S) const {
   S.EmitInt(getKind());
   EmitImpl(S);
+  if (const DeclContext *DC = dyn_cast<const DeclContext>(this))
+    DC->EmitOutRec(S);
 }
 
 Decl* Decl::Create(Deserializer& D, ASTContext& C) {
 
+  Decl *Dcl;
   Kind k = static_cast<Kind>(D.ReadInt());
 
   switch (k) {
@@ -42,39 +45,56 @@
       break;
 
     case TranslationUnit:
-      return TranslationUnitDecl::CreateImpl(D, C);
+      Dcl = TranslationUnitDecl::CreateImpl(D, C);
+      break;
 
     case Namespace:
-      return NamespaceDecl::CreateImpl(D, C);
+      Dcl = NamespaceDecl::CreateImpl(D, C);
+      break;
 
     case Var:
-      return VarDecl::CreateImpl(D, C);
+      Dcl = VarDecl::CreateImpl(D, C);
+      break;
       
     case Enum:
-      return EnumDecl::CreateImpl(D, C);
+      Dcl = EnumDecl::CreateImpl(D, C);
+      break;
       
     case EnumConstant:
-      return EnumConstantDecl::CreateImpl(D, C);
+      Dcl = EnumConstantDecl::CreateImpl(D, C);
+      break;
       
     case Field:
-      return FieldDecl::CreateImpl(D, C);
+      Dcl = FieldDecl::CreateImpl(D, C);
+      break;
       
     case ParmVar:
-      return ParmVarDecl::CreateImpl(D, C);
+      Dcl = ParmVarDecl::CreateImpl(D, C);
+      break;
       
     case Function:
-      return FunctionDecl::CreateImpl(D, C);
-     
+      Dcl = FunctionDecl::CreateImpl(D, C);
+      break;
+    
+    case Class:
     case Union:
     case Struct:
-      return RecordDecl::CreateImpl(k, D, C);
+      Dcl = RecordDecl::CreateImpl(k, D, C);
+      break;
       
     case Typedef:
-      return TypedefDecl::CreateImpl(D, C);
+      Dcl = TypedefDecl::CreateImpl(D, C);
+      break;
       
     case FileScopeAsm:
-      return FileScopeAsmDecl::CreateImpl(D, C);
+      Dcl = FileScopeAsmDecl::CreateImpl(D, C);
+      break;
   }
+
+  if (DeclContext *DC = dyn_cast<DeclContext>(Dcl))
+    DC->ReadOutRec(D, C);
+
+  return Dcl;
 }
 
 //===----------------------------------------------------------------------===//
@@ -90,6 +110,18 @@
 }
 
 //===----------------------------------------------------------------------===//
+//      Common serialization logic for subclasses of DeclContext.
+//===----------------------------------------------------------------------===//
+
+void DeclContext::EmitOutRec(Serializer& S) const {
+  S.EmitPtr(DeclChain);
+}
+
+void DeclContext::ReadOutRec(Deserializer& D, ASTContext& C) {
+  D.ReadPtr(DeclChain);
+}
+
+//===----------------------------------------------------------------------===//
 //      Common serialization logic for subclasses of NamedDecl.
 //===----------------------------------------------------------------------===//
 
@@ -283,7 +315,7 @@
   ScopedDecl::EmitInRec(S);
   S.EmitBool(isDefinition());
   S.Emit(IntegerType);  
-  S.BatchEmitOwnedPtrs(ElementList,getNextDeclarator());
+  S.BatchEmitOwnedPtrs(getEnumConstantList(),getNextDeclarator());
 }
 
 EnumDecl* EnumDecl::CreateImpl(Deserializer& D, ASTContext& C) {
@@ -299,7 +331,7 @@
   
   D.BatchReadOwnedPtrs(Elist, next_declarator, C);
   
-  decl->ElementList = cast_or_null<EnumConstantDecl>(Elist);
+  decl->setDeclChain(cast_or_null<EnumConstantDecl>(Elist));
   decl->setNextDeclarator(cast_or_null<ScopedDecl>(next_declarator));
   
   return decl;
@@ -361,7 +393,6 @@
   S.EmitInt(SClass);           // From FunctionDecl.
   S.EmitBool(IsInline);        // From FunctionDecl.
   ValueDecl::EmitInRec(S);
-  S.EmitPtr(DeclChain);
   S.EmitPtr(PreviousDeclaration);
   
   // NOTE: We do not need to serialize out the number of parameters, because
@@ -388,7 +419,6 @@
                  QualType(), SClass, IsInline, 0);
   
   decl->ValueDecl::ReadInRec(D, C);
-  D.ReadPtr(decl->DeclChain);
   D.ReadPtr(decl->PreviousDeclaration);
 
   Decl* next_declarator;