ASTReaderDecl.cpp revision 7b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8
1904c9c8389b65ee93a706ede911accd11e0b9d8eSebastian Redl//===--- ASTReaderDecl.cpp - Decl Deserialization ---------------*- C++ -*-===//
2698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner//
3698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner//                     The LLVM Compiler Infrastructure
4698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner//
5698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner// This file is distributed under the University of Illinois Open Source
6698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner// License. See LICENSE.TXT for details.
7698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner//
8698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner//===----------------------------------------------------------------------===//
9698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner//
10c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl// This file implements the ASTReader::ReadDeclRecord method, which is the
11698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner// entrypoint for loading a decl.
12698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner//
13698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner//===----------------------------------------------------------------------===//
14698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
157b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis#include "ASTCommon.h"
166ab7cd853e9c15cf986a8a7c3db1f8d20e275409Sebastian Redl#include "clang/Serialization/ASTReader.h"
17698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner#include "clang/AST/ASTConsumer.h"
18698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner#include "clang/AST/ASTContext.h"
19698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner#include "clang/AST/DeclVisitor.h"
20698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner#include "clang/AST/DeclGroup.h"
216ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner#include "clang/AST/DeclCXX.h"
226ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner#include "clang/AST/DeclTemplate.h"
23698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner#include "clang/AST/Expr.h"
24698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattnerusing namespace clang;
258538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlusing namespace clang::serialization;
26698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
27698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner//===----------------------------------------------------------------------===//
28698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner// Declaration deserialization
29698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner//===----------------------------------------------------------------------===//
30698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
316764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidisnamespace clang {
32d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl  class ASTDeclReader : public DeclVisitor<ASTDeclReader, void> {
33c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl    ASTReader &Reader;
34c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    ASTReader::PerFileData &F;
35577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    llvm::BitstreamCursor &Cursor;
368538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    const DeclID ThisDeclID;
37c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis    typedef ASTReader::RecordData RecordData;
38c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis    const RecordData &Record;
39698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    unsigned &Idx;
408538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    TypeID TypeIDForTypeDecl;
41698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
42577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    uint64_t GetCurrentCursorOffset();
43c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis    SourceLocation ReadSourceLocation(const RecordData &R, unsigned &I) {
44c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      return Reader.ReadSourceLocation(F, R, I);
45c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    }
46c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis    SourceRange ReadSourceRange(const RecordData &R, unsigned &I) {
47c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      return Reader.ReadSourceRange(F, R, I);
48c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    }
49c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis    TypeSourceInfo *GetTypeSourceInfo(const RecordData &R, unsigned &I) {
50c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      return Reader.GetTypeSourceInfo(F, R, I);
51c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    }
524045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    void ReadQualifierInfo(QualifierInfo &Info,
53c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis                           const RecordData &R, unsigned &I) {
544045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis      Reader.ReadQualifierInfo(F, Info, R, I);
554045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    }
564045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    void ReadDeclarationNameLoc(DeclarationNameLoc &DNLoc, DeclarationName Name,
57c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis                                const RecordData &R, unsigned &I) {
584045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis      Reader.ReadDeclarationNameLoc(F, DNLoc, Name, R, I);
594045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    }
604045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    void ReadDeclarationNameInfo(DeclarationNameInfo &NameInfo,
61c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis                                const RecordData &R, unsigned &I) {
624045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis      Reader.ReadDeclarationNameInfo(F, NameInfo, R, I);
634045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    }
64577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl
65c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis    void ReadCXXDefinitionData(struct CXXRecordDecl::DefinitionData &Data);
66698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  public:
67c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    ASTDeclReader(ASTReader &Reader, ASTReader::PerFileData &F,
68c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl                  llvm::BitstreamCursor &Cursor, DeclID thisDeclID,
69c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis                  const RecordData &Record, unsigned &Idx)
70c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      : Reader(Reader), F(F), Cursor(Cursor), ThisDeclID(thisDeclID),
71c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        Record(Record), Idx(Idx), TypeIDForTypeDecl(0) { }
72698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
73d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis    void Visit(Decl *D);
74d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis
757b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis    void UpdateDecl(Decl *D, const RecordData &Record);
767b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis
77698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitDecl(Decl *D);
78698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitTranslationUnitDecl(TranslationUnitDecl *TU);
79698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitNamedDecl(NamedDecl *ND);
800cef483f3b9d6a7f9fdbc5910d0a3ed64130e8e1Douglas Gregor    void VisitNamespaceDecl(NamespaceDecl *D);
816ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitUsingDirectiveDecl(UsingDirectiveDecl *D);
826ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitNamespaceAliasDecl(NamespaceAliasDecl *D);
83698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitTypeDecl(TypeDecl *TD);
84698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitTypedefDecl(TypedefDecl *TD);
858f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidis    void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D);
86698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitTagDecl(TagDecl *TD);
87698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitEnumDecl(EnumDecl *ED);
88698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitRecordDecl(RecordDecl *RD);
896ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitCXXRecordDecl(CXXRecordDecl *D);
906ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitClassTemplateSpecializationDecl(
916ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                            ClassTemplateSpecializationDecl *D);
926ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitClassTemplatePartialSpecializationDecl(
936ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                     ClassTemplatePartialSpecializationDecl *D);
946ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);
95698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitValueDecl(ValueDecl *VD);
96698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitEnumConstantDecl(EnumConstantDecl *ECD);
978f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidis    void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D);
98d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis    void VisitDeclaratorDecl(DeclaratorDecl *DD);
99698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitFunctionDecl(FunctionDecl *FD);
1006ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitCXXMethodDecl(CXXMethodDecl *D);
1016ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitCXXConstructorDecl(CXXConstructorDecl *D);
1026ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitCXXDestructorDecl(CXXDestructorDecl *D);
1036ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitCXXConversionDecl(CXXConversionDecl *D);
104698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitFieldDecl(FieldDecl *FD);
105698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitVarDecl(VarDecl *VD);
106698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitImplicitParamDecl(ImplicitParamDecl *PD);
107698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitParmVarDecl(ParmVarDecl *PD);
1086ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D);
1096ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitTemplateDecl(TemplateDecl *D);
1109eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne    void VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D);
1116ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitClassTemplateDecl(ClassTemplateDecl *D);
112f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    void VisitFunctionTemplateDecl(FunctionTemplateDecl *D);
1136ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);
114b01a552d7bafb889305affe83018563620aab326Argyrios Kyrtzidis    void VisitUsingDecl(UsingDecl *D);
115b01a552d7bafb889305affe83018563620aab326Argyrios Kyrtzidis    void VisitUsingShadowDecl(UsingShadowDecl *D);
1166ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitLinkageSpecDecl(LinkageSpecDecl *D);
117698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitFileScopeAsmDecl(FileScopeAsmDecl *AD);
1186206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara    void VisitAccessSpecDecl(AccessSpecDecl *D);
1196764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis    void VisitFriendDecl(FriendDecl *D);
1206ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitFriendTemplateDecl(FriendTemplateDecl *D);
1216ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitStaticAssertDecl(StaticAssertDecl *D);
122698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitBlockDecl(BlockDecl *BD);
1236ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
124698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    std::pair<uint64_t, uint64_t> VisitDeclContext(DeclContext *DC);
125a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    template <typename T> void VisitRedeclarable(Redeclarable<T> *D);
1266ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
1279a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt    // FIXME: Reorder according to DeclNodes.td?
128698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCMethodDecl(ObjCMethodDecl *D);
129698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCContainerDecl(ObjCContainerDecl *D);
130698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
131698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCIvarDecl(ObjCIvarDecl *D);
132698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCProtocolDecl(ObjCProtocolDecl *D);
133698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D);
134698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCClassDecl(ObjCClassDecl *D);
135698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D);
136698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCCategoryDecl(ObjCCategoryDecl *D);
137698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCImplDecl(ObjCImplDecl *D);
138698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D);
139698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCImplementationDecl(ObjCImplementationDecl *D);
140698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D);
141698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCPropertyDecl(ObjCPropertyDecl *D);
142698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D);
143698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  };
144698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
145698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
146d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redluint64_t ASTDeclReader::GetCurrentCursorOffset() {
147577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  uint64_t Off = 0;
148577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  for (unsigned I = 0, N = Reader.Chain.size(); I != N; ++I) {
149c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl    ASTReader::PerFileData &F = *Reader.Chain[N - I - 1];
150577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    if (&Cursor == &F.DeclsCursor) {
151577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl      Off += F.DeclsCursor.GetCurrentBitNo();
152577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl      break;
153577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    }
154577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    Off += F.SizeInBits;
155577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  }
156577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  return Off;
157577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl}
158577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl
159d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::Visit(Decl *D) {
160d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl  DeclVisitor<ASTDeclReader, void>::Visit(D);
161d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis
16291468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis  if (TypeDecl *TD = dyn_cast<TypeDecl>(D)) {
163deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor    // if we have a fully initialized TypeDecl, we can safely read its type now.
164deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor    TD->setTypeForDecl(Reader.GetType(TypeIDForTypeDecl).getTypePtr());
16591468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis  } else if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
16691468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis    // FunctionDecl's body was written last after all other Stmts/Exprs.
16791468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis    if (Record[Idx++])
168577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl      FD->setLazyBody(GetCurrentCursorOffset());
16991468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis  }
170d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis}
171d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis
172d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitDecl(Decl *D) {
173698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setDeclContext(cast_or_null<DeclContext>(Reader.GetDecl(Record[Idx++])));
174698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setLexicalDeclContext(
175698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                     cast_or_null<DeclContext>(Reader.GetDecl(Record[Idx++])));
176c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setLocation(ReadSourceLocation(Record, Idx));
177698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setInvalidDecl(Record[Idx++]);
1784eb9fc0449ddbd5239ddc3ae6b6e52880f47dcf7Argyrios Kyrtzidis  if (Record[Idx++]) { // hasAttrs
179cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt    AttrVec Attrs;
1804eb9fc0449ddbd5239ddc3ae6b6e52880f47dcf7Argyrios Kyrtzidis    Reader.ReadAttributes(F, Attrs, Record, Idx);
181cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt    D->setAttrs(Attrs);
182cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt  }
183698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setImplicit(Record[Idx++]);
184e0762c92110dfdcdd207db461a4ea17afd168f1eDouglas Gregor  D->setUsed(Record[Idx++]);
185698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setAccess((AccessSpecifier)Record[Idx++]);
1861d9f1fe7173e3084325f43c78af812a36d8a2a7cSebastian Redl  D->setPCHLevel(Record[Idx++] + (F.Type <= ASTReader::PCH));
187698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
188698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
189d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTranslationUnitDecl(TranslationUnitDecl *TU) {
190698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitDecl(TU);
1916ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  TU->setAnonymousNamespace(
1926ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                    cast_or_null<NamespaceDecl>(Reader.GetDecl(Record[Idx++])));
193698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
194698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
195d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitNamedDecl(NamedDecl *ND) {
196698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitDecl(ND);
1971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ND->setDeclName(Reader.ReadDeclarationName(Record, Idx));
198698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
199698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
200d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTypeDecl(TypeDecl *TD) {
201698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitNamedDecl(TD);
202d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis  // Delay type reading until after we have fully initialized the decl.
203deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  TypeIDForTypeDecl = Record[Idx++];
204698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
205698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
206d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTypedefDecl(TypedefDecl *TD) {
207d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis  VisitTypeDecl(TD);
208c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TD->setTypeSourceInfo(GetTypeSourceInfo(Record, Idx));
209698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
210698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
211d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTagDecl(TagDecl *TD) {
212698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitTypeDecl(TD);
213a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  VisitRedeclarable(TD);
2146b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  TD->IdentifierNamespace = Record[Idx++];
215698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  TD->setTagKind((TagDecl::TagKind)Record[Idx++]);
216698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  TD->setDefinition(Record[Idx++]);
217b37b648b3f2bba4c557a1604ced19b526b25a372Douglas Gregor  TD->setEmbeddedInDeclarator(Record[Idx++]);
218c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TD->setRBraceLoc(ReadSourceLocation(Record, Idx));
219c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TD->setTagKeywordLoc(ReadSourceLocation(Record, Idx));
2204045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  if (Record[Idx++]) { // hasExtInfo
2214045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    TagDecl::ExtInfo *Info = new (*Reader.getContext()) TagDecl::ExtInfo();
2224045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    ReadQualifierInfo(*Info, Record, Idx);
2234045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    TD->TypedefDeclOrQualifier = Info;
2244045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  } else
2254045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    TD->setTypedefForAnonDecl(
2264045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis                      cast_or_null<TypedefDecl>(Reader.GetDecl(Record[Idx++])));
227698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
228698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
229d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitEnumDecl(EnumDecl *ED) {
230698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitTagDecl(ED);
2311274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor  if (TypeSourceInfo *TI = Reader.GetTypeSourceInfo(F, Record, Idx))
2321274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor    ED->setIntegerTypeSourceInfo(TI);
2331274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor  else
2341274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor    ED->setIntegerType(Reader.GetType(Record[Idx++]));
235842aef8d942a880eeb9535d40de31a86838264cbJohn McCall  ED->setPromotionType(Reader.GetType(Record[Idx++]));
2361b5a618c59025898806160ed5e7f0ff5bb79e482John McCall  ED->setNumPositiveBits(Record[Idx++]);
2371b5a618c59025898806160ed5e7f0ff5bb79e482John McCall  ED->setNumNegativeBits(Record[Idx++]);
2381274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor  ED->IsScoped = Record[Idx++];
2391274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor  ED->IsFixed = Record[Idx++];
24074228274ba9b27a26a311010b02c371f558e3bfcArgyrios Kyrtzidis  ED->setInstantiationOfMemberEnum(
24174228274ba9b27a26a311010b02c371f558e3bfcArgyrios Kyrtzidis                         cast_or_null<EnumDecl>(Reader.GetDecl(Record[Idx++])));
242698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
243698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
244d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitRecordDecl(RecordDecl *RD) {
245698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitTagDecl(RD);
246698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  RD->setHasFlexibleArrayMember(Record[Idx++]);
247698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  RD->setAnonymousStructOrUnion(Record[Idx++]);
248643b7dfb7803003d62e18da65cbe81ad001851b7Fariborz Jahanian  RD->setHasObjectMember(Record[Idx++]);
249698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
250698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
251d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitValueDecl(ValueDecl *VD) {
252698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitNamedDecl(VD);
253698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VD->setType(Reader.GetType(Record[Idx++]));
254698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
255698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
256d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitEnumConstantDecl(EnumConstantDecl *ECD) {
257698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitValueDecl(ECD);
258698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  if (Record[Idx++])
259c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    ECD->setInitExpr(Reader.ReadExpr(F));
260698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  ECD->setInitVal(Reader.ReadAPSInt(Record, Idx));
261698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
262698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
263d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitDeclaratorDecl(DeclaratorDecl *DD) {
264d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis  VisitValueDecl(DD);
2654045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  if (Record[Idx++]) { // hasExtInfo
2664045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    DeclaratorDecl::ExtInfo *Info
2674045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis        = new (*Reader.getContext()) DeclaratorDecl::ExtInfo();
2684045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    ReadQualifierInfo(*Info, Record, Idx);
2694045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    Info->TInfo = GetTypeSourceInfo(Record, Idx);
2704045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    DD->DeclInfo = Info;
2714045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  } else
2724045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    DD->DeclInfo = GetTypeSourceInfo(Record, Idx);
273d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis}
274d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis
275d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFunctionDecl(FunctionDecl *FD) {
276d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis  VisitDeclaratorDecl(FD);
2776b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  VisitRedeclarable(FD);
2786ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
2794045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  ReadDeclarationNameLoc(FD->DNLoc, FD->getDeclName(), Record, Idx);
280c8f9af2943699ff623ca08f2e5ed4d72e0351189Argyrios Kyrtzidis  FD->IdentifierNamespace = Record[Idx++];
281f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  switch ((FunctionDecl::TemplatedKind)Record[Idx++]) {
282dc767e368471288bef8716d19b0e929647246bfcArgyrios Kyrtzidis  default: assert(false && "Unhandled TemplatedKind!");
283dc767e368471288bef8716d19b0e929647246bfcArgyrios Kyrtzidis    break;
284f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  case FunctionDecl::TK_NonTemplate:
285f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    break;
286f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  case FunctionDecl::TK_FunctionTemplate:
287f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    FD->setDescribedFunctionTemplate(
288f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis                     cast<FunctionTemplateDecl>(Reader.GetDecl(Record[Idx++])));
289f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    break;
290f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  case FunctionDecl::TK_MemberSpecialization: {
291f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    FunctionDecl *InstFD = cast<FunctionDecl>(Reader.GetDecl(Record[Idx++]));
292f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++];
293c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SourceLocation POI = ReadSourceLocation(Record, Idx);
2946b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis    FD->setInstantiationOfMemberFunction(*Reader.getContext(), InstFD, TSK);
295f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    FD->getMemberSpecializationInfo()->setPointOfInstantiation(POI);
296f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    break;
297f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  }
298f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  case FunctionDecl::TK_FunctionTemplateSpecialization: {
299f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    FunctionTemplateDecl *Template
300f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis      = cast<FunctionTemplateDecl>(Reader.GetDecl(Record[Idx++]));
301f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++];
302f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis
303f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    // Template arguments.
304f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    llvm::SmallVector<TemplateArgument, 8> TemplArgs;
305c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    Reader.ReadTemplateArgumentList(TemplArgs, F, Record, Idx);
306f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis
307f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    // Template args as written.
308f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    llvm::SmallVector<TemplateArgumentLoc, 8> TemplArgLocs;
309f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    SourceLocation LAngleLoc, RAngleLoc;
3105efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis    if (Record[Idx++]) {  // TemplateArgumentsAsWritten != 0
3115efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis      unsigned NumTemplateArgLocs = Record[Idx++];
3125efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis      TemplArgLocs.reserve(NumTemplateArgLocs);
3135efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis      for (unsigned i=0; i != NumTemplateArgLocs; ++i)
314577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl        TemplArgLocs.push_back(
315c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl            Reader.ReadTemplateArgumentLoc(F, Record, Idx));
3165efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis
317c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      LAngleLoc = ReadSourceLocation(Record, Idx);
318c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      RAngleLoc = ReadSourceLocation(Record, Idx);
319f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    }
3207b081c8604efd33bc7f7e5c1e9427a031eedb2b4Argyrios Kyrtzidis
321c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SourceLocation POI = ReadSourceLocation(Record, Idx);
322f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis
323a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis    ASTContext &C = *Reader.getContext();
324a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis    TemplateArgumentList *TemplArgList
325a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis      = new (C) TemplateArgumentList(C, TemplArgs.data(), TemplArgs.size());
326a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis    TemplateArgumentListInfo *TemplArgsInfo
327a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis      = new (C) TemplateArgumentListInfo(LAngleLoc, RAngleLoc);
328a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis    for (unsigned i=0, e = TemplArgLocs.size(); i != e; ++i)
329a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis      TemplArgsInfo->addArgument(TemplArgLocs[i]);
330a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis    FunctionTemplateSpecializationInfo *FTInfo
331a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis        = FunctionTemplateSpecializationInfo::Create(C, FD, Template, TSK,
332a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis                                                     TemplArgList,
333a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis                                                     TemplArgsInfo, POI);
334a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis    FD->TemplateOrSpecialization = FTInfo;
3356b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis
336a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis    if (FD->isCanonicalDecl()) { // if canonical add to template's set.
33799a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis      // The template that contains the specializations set. It's not safe to
33899a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis      // use getCanonicalDecl on Template since it may still be initializing.
33999a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis      FunctionTemplateDecl *CanonTemplate
34099a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis        = cast<FunctionTemplateDecl>(Reader.GetDecl(Record[Idx++]));
341a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis      // Get the InsertPos by FindNodeOrInsertPos() instead of calling
342a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis      // InsertNode(FTInfo) directly to avoid the getASTContext() call in
343a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis      // FunctionTemplateSpecializationInfo's Profile().
344a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis      // We avoid getASTContext because a decl in the parent hierarchy may
345a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis      // be initializing.
3466b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis      llvm::FoldingSetNodeID ID;
3476b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis      FunctionTemplateSpecializationInfo::Profile(ID, TemplArgs.data(),
3486b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis                                                  TemplArgs.size(), C);
3496b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis      void *InsertPos = 0;
35099a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis      CanonTemplate->getSpecializations().FindNodeOrInsertPos(ID, InsertPos);
351a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis      assert(InsertPos && "Another specialization already inserted!");
35299a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis      CanonTemplate->getSpecializations().InsertNode(FTInfo, InsertPos);
3536b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis    }
354dc767e368471288bef8716d19b0e929647246bfcArgyrios Kyrtzidis    break;
355f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  }
356f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  case FunctionDecl::TK_DependentFunctionTemplateSpecialization: {
357f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    // Templates.
358f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    UnresolvedSet<8> TemplDecls;
359f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    unsigned NumTemplates = Record[Idx++];
360f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    while (NumTemplates--)
361f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis      TemplDecls.addDecl(cast<NamedDecl>(Reader.GetDecl(Record[Idx++])));
362f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis
363f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    // Templates args.
364f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    TemplateArgumentListInfo TemplArgs;
365f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    unsigned NumArgs = Record[Idx++];
366f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    while (NumArgs--)
367c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      TemplArgs.addArgument(Reader.ReadTemplateArgumentLoc(F, Record, Idx));
368c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    TemplArgs.setLAngleLoc(ReadSourceLocation(Record, Idx));
369c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    TemplArgs.setRAngleLoc(ReadSourceLocation(Record, Idx));
370f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis
371f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    FD->setDependentTemplateSpecialization(*Reader.getContext(),
372f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis                                           TemplDecls, TemplArgs);
373dc767e368471288bef8716d19b0e929647246bfcArgyrios Kyrtzidis    break;
374f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  }
375f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  }
3765efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis
377d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl  // FunctionDecl's body is handled last at ASTDeclReader::Visit,
37891468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis  // after everything else is read.
37991468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis
380d931b086984257de68868a64a235c2b4b34003fbJohn McCall  FD->setStorageClass((StorageClass)Record[Idx++]);
381d931b086984257de68868a64a235c2b4b34003fbJohn McCall  FD->setStorageClassAsWritten((StorageClass)Record[Idx++]);
3825efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis  FD->setInlineSpecified(Record[Idx++]);
3835efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis  FD->setVirtualAsWritten(Record[Idx++]);
3845efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis  FD->setPure(Record[Idx++]);
3855efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis  FD->setHasInheritedPrototype(Record[Idx++]);
3865efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis  FD->setHasWrittenPrototype(Record[Idx++]);
3875efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis  FD->setDeleted(Record[Idx++]);
3885efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis  FD->setTrivial(Record[Idx++]);
3895efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis  FD->setHasImplicitReturnZero(Record[Idx++]);
390c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  FD->setLocEnd(ReadSourceLocation(Record, Idx));
3915efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis
3926ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  // Read in the parameters.
393698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned NumParams = Record[Idx++];
394698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  llvm::SmallVector<ParmVarDecl *, 16> Params;
395698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  Params.reserve(NumParams);
396698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  for (unsigned I = 0; I != NumParams; ++I)
397698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    Params.push_back(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++])));
3986b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  FD->setParams(*Reader.getContext(), Params.data(), NumParams);
399698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
400698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
401d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCMethodDecl(ObjCMethodDecl *MD) {
402698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitNamedDecl(MD);
403698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  if (Record[Idx++]) {
404698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    // In practice, this won't be executed (since method definitions
405698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    // don't occur in header files).
406c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    MD->setBody(Reader.ReadStmt(F));
407698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    MD->setSelfDecl(cast<ImplicitParamDecl>(Reader.GetDecl(Record[Idx++])));
408698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    MD->setCmdDecl(cast<ImplicitParamDecl>(Reader.GetDecl(Record[Idx++])));
409698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  }
410698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  MD->setInstanceMethod(Record[Idx++]);
411698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  MD->setVariadic(Record[Idx++]);
412698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  MD->setSynthesized(Record[Idx++]);
4133fe104154dd2e8ffb351142d74f308938b5c99bfFariborz Jahanian  MD->setDefined(Record[Idx++]);
414698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  MD->setDeclImplementation((ObjCMethodDecl::ImplementationControl)Record[Idx++]);
415698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  MD->setObjCDeclQualifier((Decl::ObjCDeclQualifier)Record[Idx++]);
4167732cc9c0fdc97a2f8cce4e5933d8103213d1aefFariborz Jahanian  MD->setNumSelectorArgs(unsigned(Record[Idx++]));
417698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  MD->setResultType(Reader.GetType(Record[Idx++]));
418c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  MD->setResultTypeSourceInfo(GetTypeSourceInfo(Record, Idx));
419c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  MD->setEndLoc(ReadSourceLocation(Record, Idx));
420698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned NumParams = Record[Idx++];
421698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  llvm::SmallVector<ParmVarDecl *, 16> Params;
422698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  Params.reserve(NumParams);
423698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  for (unsigned I = 0; I != NumParams; ++I)
424698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    Params.push_back(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++])));
4254ecb25fa94897b2c03510292acace710e5262ba5Fariborz Jahanian  MD->setMethodParams(*Reader.getContext(), Params.data(), NumParams,
4264ecb25fa94897b2c03510292acace710e5262ba5Fariborz Jahanian                      NumParams);
427698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
428698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
429d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCContainerDecl(ObjCContainerDecl *CD) {
430698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitNamedDecl(CD);
431c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  SourceLocation A = ReadSourceLocation(Record, Idx);
432c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  SourceLocation B = ReadSourceLocation(Record, Idx);
433782f2f52b78d8ca785110398a7f7b56b830b9ac7Ted Kremenek  CD->setAtEndRange(SourceRange(A, B));
434698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
435698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
436d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCInterfaceDecl(ObjCInterfaceDecl *ID) {
437698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitObjCContainerDecl(ID);
438deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  ID->setTypeForDecl(Reader.GetType(Record[Idx++]).getTypePtr());
439698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  ID->setSuperClass(cast_or_null<ObjCInterfaceDecl>
440698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                       (Reader.GetDecl(Record[Idx++])));
44153b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek
44253b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek  // Read the directly referenced protocols and their SourceLocations.
443698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned NumProtocols = Record[Idx++];
444698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  llvm::SmallVector<ObjCProtocolDecl *, 16> Protocols;
445698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  Protocols.reserve(NumProtocols);
446698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  for (unsigned I = 0; I != NumProtocols; ++I)
447698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    Protocols.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++])));
44818df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  llvm::SmallVector<SourceLocation, 16> ProtoLocs;
44918df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  ProtoLocs.reserve(NumProtocols);
45018df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  for (unsigned I = 0; I != NumProtocols; ++I)
451c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    ProtoLocs.push_back(ReadSourceLocation(Record, Idx));
45218df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  ID->setProtocolList(Protocols.data(), NumProtocols, ProtoLocs.data(),
45318df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor                      *Reader.getContext());
45453b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek
45553b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek  // Read the transitive closure of protocols referenced by this class.
45653b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek  NumProtocols = Record[Idx++];
45753b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek  Protocols.clear();
45853b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek  Protocols.reserve(NumProtocols);
45953b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek  for (unsigned I = 0; I != NumProtocols; ++I)
46053b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek    Protocols.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++])));
46153b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek  ID->AllReferencedProtocols.set(Protocols.data(), NumProtocols,
46253b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek                                 *Reader.getContext());
46353b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek
46453b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek  // Read the ivars.
465698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned NumIvars = Record[Idx++];
466698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  llvm::SmallVector<ObjCIvarDecl *, 16> IVars;
467698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  IVars.reserve(NumIvars);
468698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  for (unsigned I = 0; I != NumIvars; ++I)
469698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    IVars.push_back(cast<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++])));
470698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  ID->setCategoryList(
471698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner               cast_or_null<ObjCCategoryDecl>(Reader.GetDecl(Record[Idx++])));
4722c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian  // We will rebuild this list lazily.
4732c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian  ID->setIvarList(0);
474deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  ID->setForwardDecl(Record[Idx++]);
475deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  ID->setImplicitInterfaceDecl(Record[Idx++]);
476c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  ID->setClassLoc(ReadSourceLocation(Record, Idx));
477c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  ID->setSuperClassLoc(ReadSourceLocation(Record, Idx));
478c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  ID->setLocEnd(ReadSourceLocation(Record, Idx));
479698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
480698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
481d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCIvarDecl(ObjCIvarDecl *IVD) {
482698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitFieldDecl(IVD);
483698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  IVD->setAccessControl((ObjCIvarDecl::AccessControl)Record[Idx++]);
4842c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian  // This field will be built lazily.
4852c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian  IVD->setNextIvar(0);
486ac0021ba802e193e0f9f8207768c7862c7603bc0Fariborz Jahanian  bool synth = Record[Idx++];
487ac0021ba802e193e0f9f8207768c7862c7603bc0Fariborz Jahanian  IVD->setSynthesize(synth);
488698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
489698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
490d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCProtocolDecl(ObjCProtocolDecl *PD) {
491698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitObjCContainerDecl(PD);
492698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  PD->setForwardDecl(Record[Idx++]);
493c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  PD->setLocEnd(ReadSourceLocation(Record, Idx));
494698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned NumProtoRefs = Record[Idx++];
495698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  llvm::SmallVector<ObjCProtocolDecl *, 16> ProtoRefs;
496698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  ProtoRefs.reserve(NumProtoRefs);
497698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  for (unsigned I = 0; I != NumProtoRefs; ++I)
498698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    ProtoRefs.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++])));
49918df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  llvm::SmallVector<SourceLocation, 16> ProtoLocs;
50018df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  ProtoLocs.reserve(NumProtoRefs);
50118df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  for (unsigned I = 0; I != NumProtoRefs; ++I)
502c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    ProtoLocs.push_back(ReadSourceLocation(Record, Idx));
50318df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  PD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(),
50418df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor                      *Reader.getContext());
505698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
506698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
507d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *FD) {
508698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitFieldDecl(FD);
509698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
510698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
511d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCClassDecl(ObjCClassDecl *CD) {
512698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitDecl(CD);
513698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned NumClassRefs = Record[Idx++];
514698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  llvm::SmallVector<ObjCInterfaceDecl *, 16> ClassRefs;
515698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  ClassRefs.reserve(NumClassRefs);
516698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  for (unsigned I = 0; I != NumClassRefs; ++I)
517698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    ClassRefs.push_back(cast<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])));
518321c22f1c4271c3d9a3d4d3fc18847f948ab595bTed Kremenek  llvm::SmallVector<SourceLocation, 16> SLocs;
519321c22f1c4271c3d9a3d4d3fc18847f948ab595bTed Kremenek  SLocs.reserve(NumClassRefs);
520321c22f1c4271c3d9a3d4d3fc18847f948ab595bTed Kremenek  for (unsigned I = 0; I != NumClassRefs; ++I)
521c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SLocs.push_back(ReadSourceLocation(Record, Idx));
522321c22f1c4271c3d9a3d4d3fc18847f948ab595bTed Kremenek  CD->setClassList(*Reader.getContext(), ClassRefs.data(), SLocs.data(),
523321c22f1c4271c3d9a3d4d3fc18847f948ab595bTed Kremenek                   NumClassRefs);
524698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
525698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
526d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *FPD) {
527698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitDecl(FPD);
528698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned NumProtoRefs = Record[Idx++];
529698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  llvm::SmallVector<ObjCProtocolDecl *, 16> ProtoRefs;
530698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  ProtoRefs.reserve(NumProtoRefs);
531698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  for (unsigned I = 0; I != NumProtoRefs; ++I)
532698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    ProtoRefs.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++])));
53318df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  llvm::SmallVector<SourceLocation, 16> ProtoLocs;
53418df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  ProtoLocs.reserve(NumProtoRefs);
53518df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  for (unsigned I = 0; I != NumProtoRefs; ++I)
536c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    ProtoLocs.push_back(ReadSourceLocation(Record, Idx));
53718df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  FPD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(),
53818df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor                       *Reader.getContext());
539698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
540698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
541d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCCategoryDecl(ObjCCategoryDecl *CD) {
542698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitObjCContainerDecl(CD);
543698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  CD->setClassInterface(cast<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])));
544698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned NumProtoRefs = Record[Idx++];
545698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  llvm::SmallVector<ObjCProtocolDecl *, 16> ProtoRefs;
546698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  ProtoRefs.reserve(NumProtoRefs);
547698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  for (unsigned I = 0; I != NumProtoRefs; ++I)
548698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    ProtoRefs.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++])));
54918df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  llvm::SmallVector<SourceLocation, 16> ProtoLocs;
55018df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  ProtoLocs.reserve(NumProtoRefs);
55118df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  for (unsigned I = 0; I != NumProtoRefs; ++I)
552c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    ProtoLocs.push_back(ReadSourceLocation(Record, Idx));
55318df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  CD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(),
55418df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor                      *Reader.getContext());
555698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  CD->setNextClassCategory(cast_or_null<ObjCCategoryDecl>(Reader.GetDecl(Record[Idx++])));
556000835d0b04345c0014c603fe6339b3bc154050eFariborz Jahanian  CD->setHasSynthBitfield(Record[Idx++]);
557c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  CD->setAtLoc(ReadSourceLocation(Record, Idx));
558c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  CD->setCategoryNameLoc(ReadSourceLocation(Record, Idx));
559698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
560698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
561d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *CAD) {
562698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitNamedDecl(CAD);
563698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  CAD->setClassInterface(cast<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])));
564698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
565698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
566d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
567698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitNamedDecl(D);
568c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setAtLoc(ReadSourceLocation(Record, Idx));
569c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setType(GetTypeSourceInfo(Record, Idx));
570698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  // FIXME: stable encoding
571698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setPropertyAttributes(
572698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                      (ObjCPropertyDecl::PropertyAttributeKind)Record[Idx++]);
57380aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian  D->setPropertyAttributesAsWritten(
57480aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian                      (ObjCPropertyDecl::PropertyAttributeKind)Record[Idx++]);
575698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  // FIXME: stable encoding
576698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setPropertyImplementation(
577698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                            (ObjCPropertyDecl::PropertyControl)Record[Idx++]);
578698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setGetterName(Reader.ReadDeclarationName(Record, Idx).getObjCSelector());
579698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setSetterName(Reader.ReadDeclarationName(Record, Idx).getObjCSelector());
580698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setGetterMethodDecl(
581698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                 cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++])));
582698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setSetterMethodDecl(
583698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                 cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++])));
584698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setPropertyIvarDecl(
585698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                   cast_or_null<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++])));
586698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
587698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
588d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCImplDecl(ObjCImplDecl *D) {
589aecae629269fae3bf484baf1d109e9a89d14eeadArgyrios Kyrtzidis  VisitObjCContainerDecl(D);
590698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setClassInterface(
591698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner              cast_or_null<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])));
592698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
593698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
594d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
595698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitObjCImplDecl(D);
596698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setIdentifier(Reader.GetIdentifierInfo(Record, Idx));
597698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
598698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
599d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
600698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitObjCImplDecl(D);
601698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setSuperClass(
602698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner              cast_or_null<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])));
6039d50c0635fb213b2a1857e3f8488580f0dab2f98Argyrios Kyrtzidis  llvm::tie(D->IvarInitializers, D->NumIvarInitializers)
604c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      = Reader.ReadCXXBaseOrMemberInitializers(F, Record, Idx);
605000835d0b04345c0014c603fe6339b3bc154050eFariborz Jahanian  D->setHasSynthBitfield(Record[Idx++]);
606698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
607698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
608698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
609d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {
610698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitDecl(D);
611c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setAtLoc(ReadSourceLocation(Record, Idx));
612698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setPropertyDecl(
613698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner               cast_or_null<ObjCPropertyDecl>(Reader.GetDecl(Record[Idx++])));
614698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setPropertyIvarDecl(
615698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                   cast_or_null<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++])));
616c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setGetterCXXConstructor(Reader.ReadExpr(F));
617c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setSetterCXXAssignment(Reader.ReadExpr(F));
618698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
619698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
620d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFieldDecl(FieldDecl *FD) {
621d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis  VisitDeclaratorDecl(FD);
622698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  FD->setMutable(Record[Idx++]);
623698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  if (Record[Idx++])
624c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    FD->setBitWidth(Reader.ReadExpr(F));
625c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  if (!FD->getDeclName()) {
626c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis    FieldDecl *Tmpl = cast_or_null<FieldDecl>(Reader.GetDecl(Record[Idx++]));
627c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis    if (Tmpl)
628c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis      Reader.getContext()->setInstantiatedFromUnnamedFieldDecl(FD, Tmpl);
629c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  }
630698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
631698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
632d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitVarDecl(VarDecl *VD) {
633d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis  VisitDeclaratorDecl(VD);
6346b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  VisitRedeclarable(VD);
635d931b086984257de68868a64a235c2b4b34003fbJohn McCall  VD->setStorageClass((StorageClass)Record[Idx++]);
636d931b086984257de68868a64a235c2b4b34003fbJohn McCall  VD->setStorageClassAsWritten((StorageClass)Record[Idx++]);
637698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VD->setThreadSpecified(Record[Idx++]);
638698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VD->setCXXDirectInitializer(Record[Idx++]);
639324b54d3f60d92a82815512119791ce1c285b63eDouglas Gregor  VD->setExceptionVariable(Record[Idx++]);
6405077c3876beeaed32280af88244e8050078619a8Douglas Gregor  VD->setNRVOVariable(Record[Idx++]);
641698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  if (Record[Idx++])
642c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    VD->setInit(Reader.ReadExpr(F));
6439421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis
6449421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis  if (Record[Idx++]) { // HasMemberSpecializationInfo.
6459421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis    VarDecl *Tmpl = cast<VarDecl>(Reader.GetDecl(Record[Idx++]));
6469421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis    TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++];
647c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SourceLocation POI = ReadSourceLocation(Record, Idx);
6489421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis    Reader.getContext()->setInstantiatedFromStaticDataMember(VD, Tmpl, TSK,POI);
6499421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis  }
650698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
651698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
652d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitImplicitParamDecl(ImplicitParamDecl *PD) {
653698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitVarDecl(PD);
654698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
655698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
656d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitParmVarDecl(ParmVarDecl *PD) {
657698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitVarDecl(PD);
658698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  PD->setObjCDeclQualifier((Decl::ObjCDeclQualifier)Record[Idx++]);
659bf73b352acb7a2d041ce8b50171dd7f8e2b2c1bbJohn McCall  PD->setHasInheritedDefaultArg(Record[Idx++]);
660691d77f20763915fc7c9b34e29939d225fd0b4d2Argyrios Kyrtzidis  if (Record[Idx++]) // hasUninstantiatedDefaultArg.
661c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    PD->setUninstantiatedDefaultArg(Reader.ReadExpr(F));
662698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
663698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
664d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFileScopeAsmDecl(FileScopeAsmDecl *AD) {
665698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitDecl(AD);
666c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  AD->setAsmString(cast<StringLiteral>(Reader.ReadExpr(F)));
667698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
668698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
669d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitBlockDecl(BlockDecl *BD) {
670698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitDecl(BD);
671c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  BD->setBody(cast_or_null<CompoundStmt>(Reader.ReadStmt(F)));
672c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  BD->setSignatureAsWritten(GetTypeSourceInfo(Record, Idx));
673698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned NumParams = Record[Idx++];
674698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  llvm::SmallVector<ParmVarDecl *, 16> Params;
675698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  Params.reserve(NumParams);
676698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  for (unsigned I = 0; I != NumParams; ++I)
677698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    Params.push_back(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++])));
678838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor  BD->setParams(Params.data(), NumParams);
679698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
680698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
681d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
6826ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitDecl(D);
6836ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  D->setLanguage((LinkageSpecDecl::LanguageIDs)Record[Idx++]);
6846ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  D->setHasBraces(Record[Idx++]);
6856ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
6866ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
687d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitNamespaceDecl(NamespaceDecl *D) {
6886ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitNamedDecl(D);
6890a0c3e72ce42f84f361c285e6963d44213ab6beaDouglas Gregor  D->IsInline = Record[Idx++];
690c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setLBracLoc(ReadSourceLocation(Record, Idx));
691c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setRBracLoc(ReadSourceLocation(Record, Idx));
6926ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  D->setNextNamespace(
6936ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                    cast_or_null<NamespaceDecl>(Reader.GetDecl(Record[Idx++])));
6946ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
6956ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  bool IsOriginal = Record[Idx++];
696a038c1dcface5a404d540a0d0688962cbe656af9Argyrios Kyrtzidis  D->OrigOrAnonNamespace.setInt(IsOriginal);
697a038c1dcface5a404d540a0d0688962cbe656af9Argyrios Kyrtzidis  D->OrigOrAnonNamespace.setPointer(
6986ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                    cast_or_null<NamespaceDecl>(Reader.GetDecl(Record[Idx++])));
6996ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
7006ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
701d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
7026ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitNamedDecl(D);
703c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->NamespaceLoc = ReadSourceLocation(Record, Idx);
704c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setQualifierRange(ReadSourceRange(Record, Idx));
7056ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  D->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx));
706c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->IdentLoc = ReadSourceLocation(Record, Idx);
7078ea5b9d832455247a15925398fb663d299d33238Douglas Gregor  D->Namespace = cast<NamedDecl>(Reader.GetDecl(Record[Idx++]));
7086ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
7096ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
710d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitUsingDecl(UsingDecl *D) {
7116ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitNamedDecl(D);
712c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setUsingLocation(ReadSourceLocation(Record, Idx));
713c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setNestedNameRange(ReadSourceRange(Record, Idx));
7146ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  D->setTargetNestedNameDecl(Reader.ReadNestedNameSpecifier(Record, Idx));
7154045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  ReadDeclarationNameLoc(D->DNLoc, D->getDeclName(), Record, Idx);
7166ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
7176ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  // FIXME: It would probably be more efficient to read these into a vector
7186ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  // and then re-cosntruct the shadow decl set over that vector since it
7196ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  // would avoid existence checks.
7206ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  unsigned NumShadows = Record[Idx++];
7216ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  for(unsigned I = 0; I != NumShadows; ++I) {
72282f8e796d6ffce1d63729a2df87c1060edf6593aArgyrios Kyrtzidis    // Avoid invariant checking of UsingDecl::addShadowDecl, the decl may still
72382f8e796d6ffce1d63729a2df87c1060edf6593aArgyrios Kyrtzidis    // be initializing.
72482f8e796d6ffce1d63729a2df87c1060edf6593aArgyrios Kyrtzidis    D->Shadows.insert(cast<UsingShadowDecl>(Reader.GetDecl(Record[Idx++])));
7256ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  }
7266ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  D->setTypeName(Record[Idx++]);
727c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  NamedDecl *Pattern = cast_or_null<NamedDecl>(Reader.GetDecl(Record[Idx++]));
728c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  if (Pattern)
729c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis    Reader.getContext()->setInstantiatedFromUsingDecl(D, Pattern);
7306ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
7316ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
732d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitUsingShadowDecl(UsingShadowDecl *D) {
7336ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitNamedDecl(D);
7346ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  D->setTargetDecl(cast<NamedDecl>(Reader.GetDecl(Record[Idx++])));
7356ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  D->setUsingDecl(cast<UsingDecl>(Reader.GetDecl(Record[Idx++])));
736c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  UsingShadowDecl *Pattern
737c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis      = cast_or_null<UsingShadowDecl>(Reader.GetDecl(Record[Idx++]));
738c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  if (Pattern)
739c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis    Reader.getContext()->setInstantiatedFromUsingShadowDecl(D, Pattern);
7406ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
7416ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
742d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {
7436ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitNamedDecl(D);
744c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->UsingLoc = ReadSourceLocation(Record, Idx);
745c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->NamespaceLoc = ReadSourceLocation(Record, Idx);
746c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->QualifierRange = ReadSourceRange(Record, Idx);
7470a35bceb7768fc0be62cb644a4e31d8bfd9fb44aDouglas Gregor  D->Qualifier = Reader.ReadNestedNameSpecifier(Record, Idx);
7480a35bceb7768fc0be62cb644a4e31d8bfd9fb44aDouglas Gregor  D->NominatedNamespace = cast<NamedDecl>(Reader.GetDecl(Record[Idx++]));
7490a35bceb7768fc0be62cb644a4e31d8bfd9fb44aDouglas Gregor  D->CommonAncestor = cast_or_null<DeclContext>(Reader.GetDecl(Record[Idx++]));
7506ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
7516ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
752d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) {
7536ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitValueDecl(D);
754c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setTargetNestedNameRange(ReadSourceRange(Record, Idx));
755c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setUsingLoc(ReadSourceLocation(Record, Idx));
7566ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  D->setTargetNestedNameSpecifier(Reader.ReadNestedNameSpecifier(Record, Idx));
7574045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  ReadDeclarationNameLoc(D->DNLoc, D->getDeclName(), Record, Idx);
7586ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
7596ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
760d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitUnresolvedUsingTypenameDecl(
7616ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                               UnresolvedUsingTypenameDecl *D) {
7626ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitTypeDecl(D);
763c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->TargetNestedNameRange = ReadSourceRange(Record, Idx);
764c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->UsingLocation = ReadSourceLocation(Record, Idx);
765c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->TypenameLocation = ReadSourceLocation(Record, Idx);
7667e24256c95afb64b4d5abf201a0f9f0527cb4cf3Douglas Gregor  D->TargetNestedNameSpecifier = Reader.ReadNestedNameSpecifier(Record, Idx);
7676ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
7686ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
769c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidisvoid ASTDeclReader::ReadCXXDefinitionData(
770c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis                                   struct CXXRecordDecl::DefinitionData &Data) {
771c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  ASTContext &C = *Reader.getContext();
772c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis
773c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  Data.UserDeclaredConstructor = Record[Idx++];
774c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  Data.UserDeclaredCopyConstructor = Record[Idx++];
775c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  Data.UserDeclaredCopyAssignment = Record[Idx++];
776c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  Data.UserDeclaredDestructor = Record[Idx++];
777c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  Data.Aggregate = Record[Idx++];
778c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  Data.PlainOldData = Record[Idx++];
779c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  Data.Empty = Record[Idx++];
780c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  Data.Polymorphic = Record[Idx++];
781c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  Data.Abstract = Record[Idx++];
782c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  Data.HasTrivialConstructor = Record[Idx++];
783c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  Data.HasTrivialCopyConstructor = Record[Idx++];
784c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  Data.HasTrivialCopyAssignment = Record[Idx++];
785c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  Data.HasTrivialDestructor = Record[Idx++];
786c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  Data.ComputedVisibleConversions = Record[Idx++];
787c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  Data.DeclaredDefaultConstructor = Record[Idx++];
788c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  Data.DeclaredCopyConstructor = Record[Idx++];
789c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  Data.DeclaredCopyAssignment = Record[Idx++];
790c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  Data.DeclaredDestructor = Record[Idx++];
791c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis
792c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  // setBases() is unsuitable since it may try to iterate the bases of an
793c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  // uninitialized base.
794c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  Data.NumBases = Record[Idx++];
795c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  Data.Bases = new(C) CXXBaseSpecifier [Data.NumBases];
796c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  for (unsigned i = 0; i != Data.NumBases; ++i)
797c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis    Data.Bases[i] = Reader.ReadCXXBaseSpecifier(F, Record, Idx);
798c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis
799c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  // FIXME: Make VBases lazily computed when needed to avoid storing them.
800c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  Data.NumVBases = Record[Idx++];
801c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  Data.VBases = new(C) CXXBaseSpecifier [Data.NumVBases];
802c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  for (unsigned i = 0; i != Data.NumVBases; ++i)
803c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis    Data.VBases[i] = Reader.ReadCXXBaseSpecifier(F, Record, Idx);
804c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis
805c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  Reader.ReadUnresolvedSet(Data.Conversions, Record, Idx);
806c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  Reader.ReadUnresolvedSet(Data.VisibleConversions, Record, Idx);
807c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  assert(Data.Definition && "Data.Definition should be already set!");
808c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis  Data.FirstFriend
809c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis      = cast_or_null<FriendDecl>(Reader.GetDecl(Record[Idx++]));
810c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis}
811c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis
812d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitCXXRecordDecl(CXXRecordDecl *D) {
8130f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis  VisitRecordDecl(D);
8140f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis
815134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis  ASTContext &C = *Reader.getContext();
8169703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis
817134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis  CXXRecordDecl *DefinitionDecl
818134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis      = cast_or_null<CXXRecordDecl>(Reader.GetDecl(Record[Idx++]));
819134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis  if (D == DefinitionDecl) {
820134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis    D->DefinitionData = new (C) struct CXXRecordDecl::DefinitionData(D);
821c01dc6fb5bae1ac60910e8fbf1d22a8fa1e691f7Argyrios Kyrtzidis    ReadCXXDefinitionData(*D->DefinitionData);
822134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis    // We read the definition info. Check if there are pending forward
823134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis    // references that need to point to this DefinitionData pointer.
824134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis    ASTReader::PendingForwardRefsMap::iterator
825134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis        FindI = Reader.PendingForwardRefs.find(D);
826134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis    if (FindI != Reader.PendingForwardRefs.end()) {
827134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis      ASTReader::ForwardRefs &Refs = FindI->second;
828134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis      for (ASTReader::ForwardRefs::iterator
829134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis             I = Refs.begin(), E = Refs.end(); I != E; ++I)
830134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis        (*I)->DefinitionData = D->DefinitionData;
831134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis#ifndef NDEBUG
832134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis      // We later check whether PendingForwardRefs is empty to make sure all
833134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis      // pending references were linked.
834134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis      Reader.PendingForwardRefs.erase(D);
835134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis#endif
836134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis    }
837134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis  } else if (DefinitionDecl) {
838134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis    if (DefinitionDecl->DefinitionData) {
839134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis      D->DefinitionData = DefinitionDecl->DefinitionData;
840134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis    } else {
841134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis      // The definition is still initializing.
842134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis      Reader.PendingForwardRefs[DefinitionDecl].push_back(D);
843134db1fff5653c164ef41c898943521c49f6ebabArgyrios Kyrtzidis    }
84437ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis  }
84537ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis
8468731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  enum CXXRecKind {
8478731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    CXXRecNotTemplate = 0, CXXRecTemplate, CXXRecMemberSpecialization
8488731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  };
8498731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  switch ((CXXRecKind)Record[Idx++]) {
8508731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  default:
851d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl    assert(false && "Out of sync with ASTDeclWriter::VisitCXXRecordDecl?");
8528731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  case CXXRecNotTemplate:
8538731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    break;
8548731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  case CXXRecTemplate:
8558b996b8cb4b4711b260b0cf21ba388d3909af10dArgyrios Kyrtzidis    D->TemplateOrInstantiation
8568b996b8cb4b4711b260b0cf21ba388d3909af10dArgyrios Kyrtzidis        = cast<ClassTemplateDecl>(Reader.GetDecl(Record[Idx++]));
8578731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    break;
8588731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  case CXXRecMemberSpecialization: {
8598731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    CXXRecordDecl *RD = cast<CXXRecordDecl>(Reader.GetDecl(Record[Idx++]));
8608731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++];
861c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SourceLocation POI = ReadSourceLocation(Record, Idx);
8628b996b8cb4b4711b260b0cf21ba388d3909af10dArgyrios Kyrtzidis    MemberSpecializationInfo *MSI = new (C) MemberSpecializationInfo(RD, TSK);
8638b996b8cb4b4711b260b0cf21ba388d3909af10dArgyrios Kyrtzidis    MSI->setPointOfInstantiation(POI);
8648b996b8cb4b4711b260b0cf21ba388d3909af10dArgyrios Kyrtzidis    D->TemplateOrInstantiation = MSI;
8658731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    break;
8668731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  }
8678731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  }
86836d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis
86936d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis  // Load the key function to avoid deserializing every method so we can
87036d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis  // compute it.
87136d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis  if (D->IsDefinition) {
87236d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis    CXXMethodDecl *Key
87336d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis        = cast_or_null<CXXMethodDecl>(Reader.GetDecl(Record[Idx++]));
87436d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis    if (Key)
87536d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis      C.KeyFunctions[D] = Key;
87636d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis  }
8776ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
8786ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
879d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitCXXMethodDecl(CXXMethodDecl *D) {
8806ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitFunctionDecl(D);
881c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  unsigned NumOverridenMethods = Record[Idx++];
882c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  while (NumOverridenMethods--) {
883c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis    CXXMethodDecl *MD = cast<CXXMethodDecl>(Reader.GetDecl(Record[Idx++]));
884c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis    // Avoid invariant checking of CXXMethodDecl::addOverriddenMethod,
885c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis    // MD may be initializing.
886c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis    Reader.getContext()->addOverriddenMethod(D, MD);
887c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  }
8886ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
8896ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
890d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitCXXConstructorDecl(CXXConstructorDecl *D) {
8916ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitCXXMethodDecl(D);
89291468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis
89391468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis  D->IsExplicitSpecified = Record[Idx++];
89491468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis  D->ImplicitlyDefined = Record[Idx++];
8958e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis  llvm::tie(D->BaseOrMemberInitializers, D->NumBaseOrMemberInitializers)
896c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      = Reader.ReadCXXBaseOrMemberInitializers(F, Record, Idx);
8976ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
8986ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
899d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitCXXDestructorDecl(CXXDestructorDecl *D) {
9006ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitCXXMethodDecl(D);
90191468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis
90291468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis  D->ImplicitlyDefined = Record[Idx++];
90391468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis  D->OperatorDelete = cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++]));
9046ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
9056ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
906d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitCXXConversionDecl(CXXConversionDecl *D) {
9076ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitCXXMethodDecl(D);
90891468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis  D->IsExplicitSpecified = Record[Idx++];
9096ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
9106ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
911d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitAccessSpecDecl(AccessSpecDecl *D) {
9126206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara  VisitDecl(D);
913c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setColonLoc(ReadSourceLocation(Record, Idx));
9146206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara}
9156206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara
916d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFriendDecl(FriendDecl *D) {
917c8f9af2943699ff623ca08f2e5ed4d72e0351189Argyrios Kyrtzidis  VisitDecl(D);
9186764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis  if (Record[Idx++])
919c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    D->Friend = GetTypeSourceInfo(Record, Idx);
9206764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis  else
9216764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis    D->Friend = cast<NamedDecl>(Reader.GetDecl(Record[Idx++]));
9226764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis  D->NextFriend = cast_or_null<FriendDecl>(Reader.GetDecl(Record[Idx++]));
9236102ca1d490836096678d7d934f0b2b78f9293ecJohn McCall  D->UnsupportedFriend = (Record[Idx++] != 0);
924c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->FriendLoc = ReadSourceLocation(Record, Idx);
9256764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis}
9266764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis
927d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFriendTemplateDecl(FriendTemplateDecl *D) {
928554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis  VisitDecl(D);
929554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis  unsigned NumParams = Record[Idx++];
930554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis  D->NumParams = NumParams;
931554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis  D->Params = new TemplateParameterList*[NumParams];
932554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis  for (unsigned i = 0; i != NumParams; ++i)
933c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    D->Params[i] = Reader.ReadTemplateParameterList(F, Record, Idx);
934554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis  if (Record[Idx++]) // HasFriendDecl
935554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis    D->Friend = cast<NamedDecl>(Reader.GetDecl(Record[Idx++]));
936554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis  else
937c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    D->Friend = GetTypeSourceInfo(Record, Idx);
938c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->FriendLoc = ReadSourceLocation(Record, Idx);
9396ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
9406ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
941d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTemplateDecl(TemplateDecl *D) {
9428731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  VisitNamedDecl(D);
9438731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis
944bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis  NamedDecl *TemplatedDecl
945bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis    = cast_or_null<NamedDecl>(Reader.GetDecl(Record[Idx++]));
946dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  TemplateParameterList* TemplateParams
947c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      = Reader.ReadTemplateParameterList(F, Record, Idx);
9488731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  D->init(TemplatedDecl, TemplateParams);
9496ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
9506ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
951d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D) {
9526b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  // Initialize CommonOrPrev before VisitTemplateDecl so that getCommonPtr()
9536b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  // can be used while this is still initializing.
9548731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis
9556b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  assert(D->CommonOrPrev.isNull() && "getCommonPtr was called earlier on this");
9569eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  RedeclarableTemplateDecl *PrevDecl =
9579eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne      cast_or_null<RedeclarableTemplateDecl>(Reader.GetDecl(Record[Idx++]));
9589eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  assert((PrevDecl == 0 || PrevDecl->getKind() == D->getKind()) &&
9599eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne         "PrevDecl kind mismatch");
9609eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  if (PrevDecl)
9619eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne    D->CommonOrPrev = PrevDecl;
9628731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  if (PrevDecl == 0) {
9636b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis    D->CommonOrPrev = D->newCommon(*Reader.getContext());
9649eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne    if (RedeclarableTemplateDecl *RTD
9659eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne          = cast_or_null<RedeclarableTemplateDecl>(Reader.GetDecl(Record[Idx++]))) {
9669eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne      assert(RTD->getKind() == D->getKind() &&
9679eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne             "InstantiatedFromMemberTemplate kind mismatch");
9689eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne      D->setInstantiatedFromMemberTemplateImpl(RTD);
9699eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne      if (Record[Idx++])
9709eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne        D->setMemberSpecialization();
9719eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne    }
9728a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne
9738a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne    RedeclarableTemplateDecl *LatestDecl =
9748a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne        cast_or_null<RedeclarableTemplateDecl>(Reader.GetDecl(Record[Idx++]));
975a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis
976a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    // This decl is a first one and the latest declaration that it points to is
9773c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl    // in the same AST file. However, if this actually needs to point to a
9783c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl    // redeclaration in another AST file, we need to update it by checking
979a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    // the FirstLatestDeclIDs map which tracks this kind of decls.
980a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    assert(Reader.GetDecl(ThisDeclID) == D && "Invalid ThisDeclID ?");
981c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl    ASTReader::FirstLatestDeclIDMap::iterator I
982a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis        = Reader.FirstLatestDeclIDs.find(ThisDeclID);
983a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    if (I != Reader.FirstLatestDeclIDs.end()) {
984a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis      Decl *NewLatest = Reader.GetDecl(I->second);
985a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis      assert((LatestDecl->getLocation().isInvalid() ||
986a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis              NewLatest->getLocation().isInvalid()  ||
987441fff128f833c46172300e3fa815920b80420f7Argyrios Kyrtzidis              !Reader.SourceMgr.isBeforeInTranslationUnit(
988441fff128f833c46172300e3fa815920b80420f7Argyrios Kyrtzidis                                                  NewLatest->getLocation(),
989441fff128f833c46172300e3fa815920b80420f7Argyrios Kyrtzidis                                                  LatestDecl->getLocation())) &&
990a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis             "The new latest is supposed to come after the previous latest");
991a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis      LatestDecl = cast<RedeclarableTemplateDecl>(NewLatest);
992a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    }
993a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis
9948a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne    assert(LatestDecl->getKind() == D->getKind() && "Latest kind mismatch");
9958a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne    D->getCommonPtr()->Latest = LatestDecl;
9969eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  }
9976b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis
9986b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  VisitTemplateDecl(D);
9996b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  D->IdentifierNamespace = Record[Idx++];
10009eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne}
10019eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
1002d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitClassTemplateDecl(ClassTemplateDecl *D) {
10039eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  VisitRedeclarableTemplateDecl(D);
10049eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
10059eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  if (D->getPreviousDeclaration() == 0) {
10068731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    // This ClassTemplateDecl owns a CommonPtr; read it.
10078731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis
1008ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis    // FoldingSets are filled in VisitClassTemplateSpecializationDecl.
10098731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    unsigned size = Record[Idx++];
1010ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis    while (size--)
1011ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis      cast<ClassTemplateSpecializationDecl>(Reader.GetDecl(Record[Idx++]));
10128731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis
10138731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    size = Record[Idx++];
1014ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis    while (size--)
1015ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis      cast<ClassTemplatePartialSpecializationDecl>(
10168731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                                 Reader.GetDecl(Record[Idx++]));
10178731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis
10188731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    // InjectedClassNameType is computed.
10198731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  }
10206ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
10216ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
1022d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitClassTemplateSpecializationDecl(
10236ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                           ClassTemplateSpecializationDecl *D) {
1024dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  VisitCXXRecordDecl(D);
1025586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis
1026586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis  ASTContext &C = *Reader.getContext();
1027dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  if (Decl *InstD = Reader.GetDecl(Record[Idx++])) {
1028dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis    if (ClassTemplateDecl *CTD = dyn_cast<ClassTemplateDecl>(InstD)) {
1029586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis      D->SpecializedTemplate = CTD;
1030dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis    } else {
1031dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis      llvm::SmallVector<TemplateArgument, 8> TemplArgs;
1032c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      Reader.ReadTemplateArgumentList(TemplArgs, F, Record, Idx);
1033586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis      TemplateArgumentList *ArgList
1034586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis          = new (C) TemplateArgumentList(C, TemplArgs.data(), TemplArgs.size());
1035586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis      ClassTemplateSpecializationDecl::SpecializedPartialSpecialization *PS
1036586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis          = new (C) ClassTemplateSpecializationDecl::
1037586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis                                             SpecializedPartialSpecialization();
1038586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis      PS->PartialSpecialization
1039586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis          = cast<ClassTemplatePartialSpecializationDecl>(InstD);
1040586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis      PS->TemplateArgs = ArgList;
1041586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis      D->SpecializedTemplate = PS;
1042dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis    }
1043dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  }
1044dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis
1045dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  // Explicit info.
1046c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  if (TypeSourceInfo *TyInfo = GetTypeSourceInfo(Record, Idx)) {
1047586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis    ClassTemplateSpecializationDecl::ExplicitSpecializationInfo *ExplicitInfo
1048586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis        = new (C) ClassTemplateSpecializationDecl::ExplicitSpecializationInfo;
1049586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis    ExplicitInfo->TypeAsWritten = TyInfo;
1050c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    ExplicitInfo->ExternLoc = ReadSourceLocation(Record, Idx);
1051c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    ExplicitInfo->TemplateKeywordLoc = ReadSourceLocation(Record, Idx);
1052586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis    D->ExplicitInfo = ExplicitInfo;
1053dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  }
1054dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis
1055dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  llvm::SmallVector<TemplateArgument, 8> TemplArgs;
1056c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  Reader.ReadTemplateArgumentList(TemplArgs, F, Record, Idx);
1057586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis  D->TemplateArgs.init(C, TemplArgs.data(), TemplArgs.size());
1058c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->PointOfInstantiation = ReadSourceLocation(Record, Idx);
1059586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis  D->SpecializationKind = (TemplateSpecializationKind)Record[Idx++];
1060ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis
1061bc5ab7c9e307fea5ecb979b30815da7a370e1c05Argyrios Kyrtzidis  if (D->isCanonicalDecl()) { // It's kept in the folding set.
1062ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis    ClassTemplateDecl *CanonPattern
1063ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis                       = cast<ClassTemplateDecl>(Reader.GetDecl(Record[Idx++]));
1064ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis    if (ClassTemplatePartialSpecializationDecl *Partial
1065ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis            = dyn_cast<ClassTemplatePartialSpecializationDecl>(D)) {
10660a67eddc8fa2d6d1319deff0d52850f079753b2aArgyrios Kyrtzidis      CanonPattern->getPartialSpecializations().InsertNode(Partial);
1067ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis    } else {
10680a67eddc8fa2d6d1319deff0d52850f079753b2aArgyrios Kyrtzidis      CanonPattern->getSpecializations().InsertNode(D);
1069ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis    }
1070ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis  }
10716ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
10726ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
1073d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitClassTemplatePartialSpecializationDecl(
10746ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                    ClassTemplatePartialSpecializationDecl *D) {
1075dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  VisitClassTemplateSpecializationDecl(D);
1076dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis
10778fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis  ASTContext &C = *Reader.getContext();
1078c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->TemplateParams = Reader.ReadTemplateParameterList(F, Record, Idx);
10798fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis
1080dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  unsigned NumArgs = Record[Idx++];
10818fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis  if (NumArgs) {
10828fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis    D->NumArgsAsWritten = NumArgs;
10838fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis    D->ArgsAsWritten = new (C) TemplateArgumentLoc[NumArgs];
10848fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis    for (unsigned i=0; i != NumArgs; ++i)
1085c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      D->ArgsAsWritten[i] = Reader.ReadTemplateArgumentLoc(F, Record, Idx);
10868fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis  }
10878fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis
10888fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis  D->SequenceNumber = Record[Idx++];
1089dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis
1090dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  // These are read/set from/to the first declaration.
1091dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  if (D->getPreviousDeclaration() == 0) {
10928fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis    D->InstantiatedFromMember.setPointer(
1093dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis        cast_or_null<ClassTemplatePartialSpecializationDecl>(
1094dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis                                                Reader.GetDecl(Record[Idx++])));
10958fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis    D->InstantiatedFromMember.setInt(Record[Idx++]);
1096dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  }
10976ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
10986ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
1099d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {
11009eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  VisitRedeclarableTemplateDecl(D);
1101f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis
11029eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  if (D->getPreviousDeclaration() == 0) {
1103f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    // This FunctionTemplateDecl owns a CommonPtr; read it.
1104f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis
1105057d9afdc7e8027f3b928f0dd8d7d921d7cd5615Argyrios Kyrtzidis    // Read the function specialization declarations.
1106057d9afdc7e8027f3b928f0dd8d7d921d7cd5615Argyrios Kyrtzidis    // FunctionTemplateDecl's FunctionTemplateSpecializationInfos are filled
110799a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis    // when reading the specialized FunctionDecl.
1108057d9afdc7e8027f3b928f0dd8d7d921d7cd5615Argyrios Kyrtzidis    unsigned NumSpecs = Record[Idx++];
1109057d9afdc7e8027f3b928f0dd8d7d921d7cd5615Argyrios Kyrtzidis    while (NumSpecs--)
1110057d9afdc7e8027f3b928f0dd8d7d921d7cd5615Argyrios Kyrtzidis      Reader.GetDecl(Record[Idx++]);
1111f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  }
11126ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
11136ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
1114d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
11158731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  VisitTypeDecl(D);
11168731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis
11178731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  D->setDeclaredWithTypename(Record[Idx++]);
11188731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  D->setParameterPack(Record[Idx++]);
11198731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis
11208731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  bool Inherited = Record[Idx++];
1121c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TypeSourceInfo *DefArg = GetTypeSourceInfo(Record, Idx);
11228731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  D->setDefaultArgument(DefArg, Inherited);
11236ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
11246ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
1125d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
1126b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis  VisitVarDecl(D);
1127b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis  // TemplateParmPosition.
1128b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis  D->setDepth(Record[Idx++]);
1129b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis  D->setPosition(Record[Idx++]);
1130b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis  // Rest of NonTypeTemplateParmDecl.
1131b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis  if (Record[Idx++]) {
1132c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    Expr *DefArg = Reader.ReadExpr(F);
1133b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis    bool Inherited = Record[Idx++];
1134b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis    D->setDefaultArgument(DefArg, Inherited);
1135b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis }
11366ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
11376ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
1138d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
1139bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis  VisitTemplateDecl(D);
1140bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis  // TemplateParmPosition.
1141bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis  D->setDepth(Record[Idx++]);
1142bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis  D->setPosition(Record[Idx++]);
1143bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis  // Rest of TemplateTemplateParmDecl.
1144c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TemplateArgumentLoc Arg = Reader.ReadTemplateArgumentLoc(F, Record, Idx);
1145bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis  bool IsInherited = Record[Idx++];
1146bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis  D->setDefaultArgument(Arg, IsInherited);
11476ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
11486ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
1149d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitStaticAssertDecl(StaticAssertDecl *D) {
11500d396896998685809bda7444d772bbeb5bbe9b46Argyrios Kyrtzidis  VisitDecl(D);
1151c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->AssertExpr = Reader.ReadExpr(F);
1152c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->Message = cast<StringLiteral>(Reader.ReadExpr(F));
11536ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
11546ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
11551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstd::pair<uint64_t, uint64_t>
1156d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian RedlASTDeclReader::VisitDeclContext(DeclContext *DC) {
1157698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  uint64_t LexicalOffset = Record[Idx++];
1158698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  uint64_t VisibleOffset = Record[Idx++];
1159698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  return std::make_pair(LexicalOffset, VisibleOffset);
1160698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
1161698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1162a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidistemplate <typename T>
1163d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitRedeclarable(Redeclarable<T> *D) {
1164a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  enum RedeclKind { NoRedeclaration = 0, PointsToPrevious, PointsToLatest };
1165a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  RedeclKind Kind = (RedeclKind)Record[Idx++];
1166a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  switch (Kind) {
1167a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  default:
1168d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl    assert(0 && "Out of sync with ASTDeclWriter::VisitRedeclarable or messed up"
1169a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis                " reading");
1170a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  case NoRedeclaration:
1171a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    break;
1172a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  case PointsToPrevious:
1173a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    D->RedeclLink = typename Redeclarable<T>::PreviousDeclLink(
1174a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis                                cast_or_null<T>(Reader.GetDecl(Record[Idx++])));
1175a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    break;
1176a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  case PointsToLatest:
1177a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    D->RedeclLink = typename Redeclarable<T>::LatestDeclLink(
1178a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis                                cast_or_null<T>(Reader.GetDecl(Record[Idx++])));
1179a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    break;
1180a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  }
1181a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis
1182a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  assert(!(Kind == PointsToPrevious &&
1183a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis           Reader.FirstLatestDeclIDs.find(ThisDeclID) !=
1184a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis               Reader.FirstLatestDeclIDs.end()) &&
1185a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis         "This decl is not first, it should not be in the map");
1186a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  if (Kind == PointsToPrevious)
1187a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    return;
1188a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis
1189a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  // This decl is a first one and the latest declaration that it points to is in
11903c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl  // the same AST file. However, if this actually needs to point to a
11913c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl  // redeclaration in another AST file, we need to update it by checking the
1192a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  // FirstLatestDeclIDs map which tracks this kind of decls.
1193a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  assert(Reader.GetDecl(ThisDeclID) == static_cast<T*>(D) &&
1194a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis         "Invalid ThisDeclID ?");
1195c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl  ASTReader::FirstLatestDeclIDMap::iterator I
1196a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis      = Reader.FirstLatestDeclIDs.find(ThisDeclID);
1197a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  if (I != Reader.FirstLatestDeclIDs.end()) {
1198a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    Decl *NewLatest = Reader.GetDecl(I->second);
1199a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    assert((D->getMostRecentDeclaration()->getLocation().isInvalid() ||
1200a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis            NewLatest->getLocation().isInvalid() ||
1201441fff128f833c46172300e3fa815920b80420f7Argyrios Kyrtzidis            !Reader.SourceMgr.isBeforeInTranslationUnit(
1202441fff128f833c46172300e3fa815920b80420f7Argyrios Kyrtzidis                               NewLatest->getLocation(),
1203441fff128f833c46172300e3fa815920b80420f7Argyrios Kyrtzidis                               D->getMostRecentDeclaration()->getLocation())) &&
1204a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis           "The new latest is supposed to come after the previous latest");
1205a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    D->RedeclLink
1206a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis        = typename Redeclarable<T>::LatestDeclLink(cast_or_null<T>(NewLatest));
1207a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  }
1208a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis}
1209a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis
1210698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner//===----------------------------------------------------------------------===//
12114e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner// Attribute Reading
1212698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner//===----------------------------------------------------------------------===//
1213698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
12144e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner/// \brief Reads attributes from the current stream position.
12154eb9fc0449ddbd5239ddc3ae6b6e52880f47dcf7Argyrios Kyrtzidisvoid ASTReader::ReadAttributes(PerFileData &F, AttrVec &Attrs,
12164eb9fc0449ddbd5239ddc3ae6b6e52880f47dcf7Argyrios Kyrtzidis                               const RecordData &Record, unsigned &Idx) {
12174eb9fc0449ddbd5239ddc3ae6b6e52880f47dcf7Argyrios Kyrtzidis  for (unsigned i = 0, e = Record[Idx++]; i != e; ++i) {
12184e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner    Attr *New = 0;
1219387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt    attr::Kind Kind = (attr::Kind)Record[Idx++];
1220c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SourceLocation Loc = ReadSourceLocation(F, Record, Idx);
1221cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt    bool isInherited = Record[Idx++];
12224e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner
1223cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt#include "clang/Serialization/AttrPCHRead.inc"
12244e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner
12254e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner    assert(New && "Unable to decode attribute?");
1226cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt    New->setInherited(isInherited);
1227cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt    Attrs.push_back(New);
12284e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner  }
12294e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner}
12304e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner
12314e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner//===----------------------------------------------------------------------===//
1232c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl// ASTReader Implementation
12334e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner//===----------------------------------------------------------------------===//
1234698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1235698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// \brief Note that we have loaded the declaration with the given
1236698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// Index.
12371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump///
1238698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// This routine notes that this declaration has already been loaded,
1239698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// so that future GetDecl calls will return this declaration rather
1240698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// than trying to load a new declaration.
1241c43b54cbc10654ed59de797898042e1a05265246Sebastian Redlinline void ASTReader::LoadedDecl(unsigned Index, Decl *D) {
1242698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  assert(!DeclsLoaded[Index] && "Decl loaded twice?");
1243698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  DeclsLoaded[Index] = D;
1244698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
1245698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1246698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1247698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// \brief Determine whether the consumer will be interested in seeing
1248698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// this declaration (via HandleTopLevelDecl).
1249698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner///
1250698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// This routine should return true for anything that might affect
1251698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// code generation, e.g., inline function definitions, Objective-C
1252698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// declarations with metadata, etc.
1253698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattnerstatic bool isConsumerInterestedIn(Decl *D) {
125404a0b50e19a5598330a4b42c5de2583e244df22fDaniel Dunbar  if (isa<FileScopeAsmDecl>(D))
125504a0b50e19a5598330a4b42c5de2583e244df22fDaniel Dunbar    return true;
1256698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  if (VarDecl *Var = dyn_cast<VarDecl>(D))
12573f95477f28ef3baaf79001a5654785c8b2075710Argyrios Kyrtzidis    return Var->isFileVarDecl() &&
12583f95477f28ef3baaf79001a5654785c8b2075710Argyrios Kyrtzidis           Var->isThisDeclarationADefinition() == VarDecl::Definition;
1259698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  if (FunctionDecl *Func = dyn_cast<FunctionDecl>(D))
1260698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    return Func->isThisDeclarationADefinition();
12619d50c0635fb213b2a1857e3f8488580f0dab2f98Argyrios Kyrtzidis  return isa<ObjCProtocolDecl>(D) || isa<ObjCImplementationDecl>(D);
1262698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
1263698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1264cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl/// \brief Get the correct cursor and offset for loading a type.
1265c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlASTReader::RecordLocation
12668538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlASTReader::DeclCursorForIndex(unsigned Index, DeclID ID) {
12670b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl  // See if there's an override.
12680b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl  DeclReplacementMap::iterator It = ReplacedDecls.find(ID);
12690b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl  if (It != ReplacedDecls.end())
1270c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    return RecordLocation(It->second.first, It->second.second);
12710b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl
1272cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl  PerFileData *F = 0;
1273cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl  for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
1274cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl    F = Chain[N - I - 1];
1275cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl    if (Index < F->LocalNumDecls)
1276cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl      break;
1277cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl    Index -= F->LocalNumDecls;
1278cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl  }
1279cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl  assert(F && F->LocalNumDecls > Index && "Broken chain");
1280c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  return RecordLocation(F, F->DeclOffsets[Index]);
1281cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl}
1282cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl
1283d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl/// \brief Read the declaration at the given offset from the AST file.
12848538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlDecl *ASTReader::ReadDeclRecord(unsigned Index, DeclID ID) {
12850b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl  RecordLocation Loc = DeclCursorForIndex(Index, ID);
1286c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  llvm::BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
1287698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  // Keep track of where we are in the stream, then jump back there
1288698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  // after reading this declaration.
1289da93061f56d5820725b01a140879d047554e7d32Chris Lattner  SavedStreamPosition SavedPosition(DeclsCursor);
1290698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1291919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  ReadingKindTracker ReadingKind(Read_Decl, *this);
1292919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
1293d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor  // Note that we are loading a declaration record.
129429ee3a273f58e16df7f2c524ab62a869e44fc9b1Argyrios Kyrtzidis  Deserializing ADecl(this);
12951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1296c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  DeclsCursor.JumpToBit(Loc.Offset);
1297698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  RecordData Record;
1298da93061f56d5820725b01a140879d047554e7d32Chris Lattner  unsigned Code = DeclsCursor.ReadCode();
1299698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned Idx = 0;
1300c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  ASTDeclReader Reader(*this, *Loc.F, DeclsCursor, ID, Record, Idx);
1301698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1302da93061f56d5820725b01a140879d047554e7d32Chris Lattner  Decl *D = 0;
13038538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  switch ((DeclCode)DeclsCursor.ReadRecord(Code, Record)) {
13048538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CONTEXT_LEXICAL:
13058538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CONTEXT_VISIBLE:
1306698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    assert(false && "Record cannot be de-serialized with ReadDeclRecord");
1307698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
13088538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_TRANSLATION_UNIT:
1309698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    assert(Index == 0 && "Translation unit must be at index 0");
1310d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = Context->getTranslationUnitDecl();
1311698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
13128538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_TYPEDEF:
1313ba6a9bd384df475780be636ca45bcef5c5bbd19fJohn McCall    D = TypedefDecl::Create(*Context, 0, SourceLocation(), 0, 0);
1314698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
13158538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_ENUM:
1316b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis    D = EnumDecl::Create(*Context, Decl::EmptyShell());
1317698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
13188538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_RECORD:
1319b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis    D = RecordDecl::Create(*Context, Decl::EmptyShell());
1320698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
13218538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_ENUM_CONSTANT:
1322d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = EnumConstantDecl::Create(*Context, 0, SourceLocation(), 0, QualType(),
1323698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                                 0, llvm::APSInt());
1324698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
13258538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_FUNCTION:
13261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    D = FunctionDecl::Create(*Context, 0, SourceLocation(), DeclarationName(),
1327a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis                             QualType(), 0);
1328698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
13298538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_LINKAGE_SPEC:
13306ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = LinkageSpecDecl::Create(*Context, 0, SourceLocation(),
13316ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                (LinkageSpecDecl::LanguageIDs)0,
13326ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                false);
13336ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13348538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_NAMESPACE:
13356ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = NamespaceDecl::Create(*Context, 0, SourceLocation(), 0);
13366ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13378538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_NAMESPACE_ALIAS:
13386ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = NamespaceAliasDecl::Create(*Context, 0, SourceLocation(),
13396ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                   SourceLocation(), 0, SourceRange(), 0,
13406ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                   SourceLocation(), 0);
13416ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13428538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_USING:
1343ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara    D = UsingDecl::Create(*Context, 0, SourceRange(), SourceLocation(),
1344ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara                          0, DeclarationNameInfo(), false);
13456ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13468538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_USING_SHADOW:
13476ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = UsingShadowDecl::Create(*Context, 0, SourceLocation(), 0, 0);
13486ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13498538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_USING_DIRECTIVE:
13506ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = UsingDirectiveDecl::Create(*Context, 0, SourceLocation(),
13516ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                   SourceLocation(), SourceRange(), 0,
13526ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                   SourceLocation(), 0, 0);
13536ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13548538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_UNRESOLVED_USING_VALUE:
13556ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = UnresolvedUsingValueDecl::Create(*Context, 0, SourceLocation(),
1356ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara                                         SourceRange(), 0,
1357ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara                                         DeclarationNameInfo());
13586ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13598538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_UNRESOLVED_USING_TYPENAME:
13606ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = UnresolvedUsingTypenameDecl::Create(*Context, 0, SourceLocation(),
13616ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                            SourceLocation(), SourceRange(),
13626ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                            0, SourceLocation(),
13636ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                            DeclarationName());
13646ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13658538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CXX_RECORD:
1366b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis    D = CXXRecordDecl::Create(*Context, Decl::EmptyShell());
13676ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13688538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CXX_METHOD:
13692577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    D = CXXMethodDecl::Create(*Context, 0, DeclarationNameInfo(),
13706ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                              QualType(), 0);
13716ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13728538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CXX_CONSTRUCTOR:
13736ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = CXXConstructorDecl::Create(*Context, Decl::EmptyShell());
13746ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13758538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CXX_DESTRUCTOR:
13766ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = CXXDestructorDecl::Create(*Context, Decl::EmptyShell());
13776ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13788538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CXX_CONVERSION:
13796ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = CXXConversionDecl::Create(*Context, Decl::EmptyShell());
13806ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13818538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_ACCESS_SPEC:
138265b63ec1410f09e1f3cdb847018d678b8f8fc3f7Argyrios Kyrtzidis    D = AccessSpecDecl::Create(*Context, Decl::EmptyShell());
13836206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara    break;
13848538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_FRIEND:
13856764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis    D = FriendDecl::Create(*Context, Decl::EmptyShell());
13866ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13878538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_FRIEND_TEMPLATE:
1388554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis    D = FriendTemplateDecl::Create(*Context, Decl::EmptyShell());
13896ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13908538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CLASS_TEMPLATE:
13915bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis    D = ClassTemplateDecl::Create(*Context, 0, SourceLocation(),
13925bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis                                  DeclarationName(), 0, 0, 0);
13936ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13948538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CLASS_TEMPLATE_SPECIALIZATION:
1395b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis    D = ClassTemplateSpecializationDecl::Create(*Context, Decl::EmptyShell());
13966ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13978538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION:
1398b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis    D = ClassTemplatePartialSpecializationDecl::Create(*Context,
1399b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis                                                            Decl::EmptyShell());
14006ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
14018538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_FUNCTION_TEMPLATE:
1402f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    D = FunctionTemplateDecl::Create(*Context, 0, SourceLocation(),
1403f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis                                     DeclarationName(), 0, 0);
14046ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
14058538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_TEMPLATE_TYPE_PARM:
1406b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis    D = TemplateTypeParmDecl::Create(*Context, Decl::EmptyShell());
14076ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
14088538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_NON_TYPE_TEMPLATE_PARM:
1409b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis    D = NonTypeTemplateParmDecl::Create(*Context, 0, SourceLocation(), 0,0,0,
1410b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis                                        QualType(),0);
14116ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
14128538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_TEMPLATE_TEMPLATE_PARM:
1413bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis    D = TemplateTemplateParmDecl::Create(*Context, 0, SourceLocation(),0,0,0,0);
14146ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
14158538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_STATIC_ASSERT:
14160d396896998685809bda7444d772bbeb5bbe9b46Argyrios Kyrtzidis    D = StaticAssertDecl::Create(*Context, 0, SourceLocation(), 0, 0);
14176ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
14186ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
14198538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_METHOD:
14201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    D = ObjCMethodDecl::Create(*Context, SourceLocation(), SourceLocation(),
14214bc1cb6aa635a5bf8fae99bf69c56c724c1e786cDouglas Gregor                               Selector(), QualType(), 0, 0);
1422698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14238538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_INTERFACE:
1424deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor    D = ObjCInterfaceDecl::Create(*Context, 0, SourceLocation(), 0);
1425698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14268538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_IVAR:
1427a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis    D = ObjCIvarDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 0,
1428698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                             ObjCIvarDecl::None);
1429698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14308538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_PROTOCOL:
1431d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = ObjCProtocolDecl::Create(*Context, 0, SourceLocation(), 0);
1432698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14338538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_AT_DEFS_FIELD:
14341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    D = ObjCAtDefsFieldDecl::Create(*Context, 0, SourceLocation(), 0,
1435698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                                    QualType(), 0);
1436698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14378538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_CLASS:
1438d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = ObjCClassDecl::Create(*Context, 0, SourceLocation());
1439698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14408538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_FORWARD_PROTOCOL:
1441d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = ObjCForwardProtocolDecl::Create(*Context, 0, SourceLocation());
1442698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14438538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_CATEGORY:
14443db211b617c5073aa70eb25d37ed44ae0dca17c4Douglas Gregor    D = ObjCCategoryDecl::Create(*Context, 0, SourceLocation(),
14453db211b617c5073aa70eb25d37ed44ae0dca17c4Douglas Gregor                                 SourceLocation(), SourceLocation(), 0);
1446698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14478538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_CATEGORY_IMPL:
1448d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = ObjCCategoryImplDecl::Create(*Context, 0, SourceLocation(), 0, 0);
1449698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14508538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_IMPLEMENTATION:
1451d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = ObjCImplementationDecl::Create(*Context, 0, SourceLocation(), 0, 0);
1452698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14538538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_COMPATIBLE_ALIAS:
1454d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = ObjCCompatibleAliasDecl::Create(*Context, 0, SourceLocation(), 0, 0);
1455698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14568538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_PROPERTY:
1457d0502407c1b41b2ace326f355d7b7a6876246223Fariborz Jahanian    D = ObjCPropertyDecl::Create(*Context, 0, SourceLocation(), 0, SourceLocation(),
145883a230c83a54190366138c1a4f4310ef838b88fcJohn McCall                                 0);
1459698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14608538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_PROPERTY_IMPL:
1461d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = ObjCPropertyImplDecl::Create(*Context, 0, SourceLocation(),
14621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     SourceLocation(), 0,
1463698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                                     ObjCPropertyImplDecl::Dynamic, 0);
1464698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14658538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_FIELD:
14661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    D = FieldDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 0, 0,
1467a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis                          false);
1468698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14698538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_VAR:
1470a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis    D = VarDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 0,
1471d931b086984257de68868a64a235c2b4b34003fbJohn McCall                        SC_None, SC_None);
1472698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
1473698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
14748538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_IMPLICIT_PARAM:
1475d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = ImplicitParamDecl::Create(*Context, 0, SourceLocation(), 0, QualType());
1476698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
1477698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
14788538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_PARM_VAR:
14791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    D = ParmVarDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 0,
1480d931b086984257de68868a64a235c2b4b34003fbJohn McCall                            SC_None, SC_None, 0);
1481698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14828538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_FILE_SCOPE_ASM:
1483d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = FileScopeAsmDecl::Create(*Context, 0, SourceLocation(), 0);
1484698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14858538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_BLOCK:
1486d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = BlockDecl::Create(*Context, 0, SourceLocation());
1487698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
1488698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  }
1489698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1490d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl  assert(D && "Unknown declaration reading AST file");
14914e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner  LoadedDecl(Index, D);
14924e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner  Reader.Visit(D);
1493698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1494698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  // If this declaration is also a declaration context, get the
1495698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  // offsets for its tables of lexical and visible declarations.
1496698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  if (DeclContext *DC = dyn_cast<DeclContext>(D)) {
1497698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    std::pair<uint64_t, uint64_t> Offsets = Reader.VisitDeclContext(DC);
1498698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    if (Offsets.first || Offsets.second) {
1499698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner      DC->setHasExternalLexicalStorage(Offsets.first != 0);
1500698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner      DC->setHasExternalVisibleStorage(Offsets.second != 0);
1501681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl      DeclContextInfo Info;
1502681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl      if (ReadDeclContextStorage(DeclsCursor, Offsets, Info))
1503681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl        return 0;
1504d692af71226d2fb537d86c670af96114ddd485c3Sebastian Redl      DeclContextInfos &Infos = DeclContextOffsets[DC];
1505e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl      // Reading the TU will happen after reading its lexical update blocks,
1506e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl      // so we need to make sure we insert in front. For all other contexts,
1507e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl      // the vector is empty here anyway, so there's no loss in efficiency.
1508d692af71226d2fb537d86c670af96114ddd485c3Sebastian Redl      Infos.insert(Infos.begin(), Info);
1509e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl
1510e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl      // Now add the pending visible updates for this decl context, if it has
1511e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl      // any.
1512e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl      DeclContextVisibleUpdatesPending::iterator I =
1513e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl          PendingVisibleUpdates.find(ID);
1514e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl      if (I != PendingVisibleUpdates.end()) {
1515e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl        DeclContextVisibleUpdates &U = I->second;
1516e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl        Info.LexicalDecls = 0;
1517e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl        Info.NumLexicalDecls = 0;
1518e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl        for (DeclContextVisibleUpdates::iterator UI = U.begin(), UE = U.end();
1519e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl             UI != UE; ++UI) {
1520e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl          Info.NameLookupTableData = *UI;
1521e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl          Infos.push_back(Info);
1522e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl        }
1523e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl        PendingVisibleUpdates.erase(I);
1524e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl      }
1525698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    }
1526698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  }
15276e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl
15286e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl  // If this is a template, read additional specializations that may be in a
15296e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl  // different part of the chain.
15306e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl  if (isa<RedeclarableTemplateDecl>(D)) {
15316e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl    AdditionalTemplateSpecializationsMap::iterator F =
15326e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl        AdditionalTemplateSpecializationsPending.find(ID);
15336e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl    if (F != AdditionalTemplateSpecializationsPending.end()) {
15346e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl      for (AdditionalTemplateSpecializations::iterator I = F->second.begin(),
15356e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl                                                       E = F->second.end();
15366e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl           I != E; ++I)
15376e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl        GetDecl(*I);
15386e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl      AdditionalTemplateSpecializationsPending.erase(F);
15396e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl    }
15406e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl  }
1541698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  assert(Idx == Record.size());
1542698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
15437b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis  // The declaration may have been modified by files later in the chain.
15447b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis  // If this is the case, read the record containing the updates from each file
15457b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis  // and pass it to ASTDeclReader to make the modifications.
15467b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis  DeclUpdateOffsetsMap::iterator UpdI = DeclUpdateOffsets.find(ID);
15477b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis  if (UpdI != DeclUpdateOffsets.end()) {
15487b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis    FileOffsetsTy &UpdateOffsets = UpdI->second;
15497b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis    for (FileOffsetsTy::iterator
15507b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis           I = UpdateOffsets.begin(), E = UpdateOffsets.end(); I != E; ++I) {
15517b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis      PerFileData *F = I->first;
15527b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis      uint64_t Offset = I->second;
15537b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis      llvm::BitstreamCursor &Cursor = F->DeclsCursor;
15547b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis      SavedStreamPosition SavedPosition(Cursor);
15557b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis      Cursor.JumpToBit(Offset);
15567b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis      RecordData Record;
15577b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis      unsigned Code = Cursor.ReadCode();
15587b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis      unsigned RecCode = Cursor.ReadRecord(Code, Record);
15597b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis      (void)RecCode;
15607b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis      assert(RecCode == DECL_UPDATES && "Expected DECL_UPDATES record!");
15617b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis      Reader.UpdateDecl(D, Record);
15627b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis    }
15637b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis  }
15647b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis
1565698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  // If we have deserialized a declaration that has a definition the
1566bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis  // AST consumer might need to know about, queue it.
1567bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis  // We don't pass it to the consumer immediately because we may be in recursive
1568bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis  // loading, and some declarations may still be initializing.
1569bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis  if (isConsumerInterestedIn(D))
1570bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis    InterestingDecls.push_back(D);
1571698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1572698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  return D;
1573698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
15747b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis
15757b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidisvoid ASTDeclReader::UpdateDecl(Decl *D, const RecordData &Record) {
15767b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis  // No update is tracked yet.
15777b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis}
1578