ASTReaderDecl.cpp revision 9703b0dd353b928b2312076f13e30950e05d5fa1
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
156ab7cd853e9c15cf986a8a7c3db1f8d20e275409Sebastian Redl#include "clang/Serialization/ASTReader.h"
16698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner#include "clang/AST/ASTConsumer.h"
17698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner#include "clang/AST/ASTContext.h"
18698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner#include "clang/AST/DeclVisitor.h"
19698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner#include "clang/AST/DeclGroup.h"
206ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner#include "clang/AST/DeclCXX.h"
216ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner#include "clang/AST/DeclTemplate.h"
22698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner#include "clang/AST/Expr.h"
23698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattnerusing namespace clang;
248538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlusing namespace clang::serialization;
25698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
26698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner//===----------------------------------------------------------------------===//
27698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner// Declaration deserialization
28698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner//===----------------------------------------------------------------------===//
29698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
306764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidisnamespace clang {
31d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl  class ASTDeclReader : public DeclVisitor<ASTDeclReader, void> {
32c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl    ASTReader &Reader;
33c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    ASTReader::PerFileData &F;
34577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    llvm::BitstreamCursor &Cursor;
358538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    const DeclID ThisDeclID;
36c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl    const ASTReader::RecordData &Record;
37698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    unsigned &Idx;
388538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    TypeID TypeIDForTypeDecl;
39698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
40577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    uint64_t GetCurrentCursorOffset();
41c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SourceLocation ReadSourceLocation(const ASTReader::RecordData &R,
42c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl                                      unsigned &I) {
43c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      return Reader.ReadSourceLocation(F, R, I);
44c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    }
45c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SourceRange ReadSourceRange(const ASTReader::RecordData &R, unsigned &I) {
46c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      return Reader.ReadSourceRange(F, R, I);
47c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    }
48c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    TypeSourceInfo *GetTypeSourceInfo(const ASTReader::RecordData &R,
49c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl                                      unsigned &I) {
50c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      return Reader.GetTypeSourceInfo(F, R, I);
51c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    }
524045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    void ReadQualifierInfo(QualifierInfo &Info,
534045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis                           const ASTReader::RecordData &R, unsigned &I) {
544045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis      Reader.ReadQualifierInfo(F, Info, R, I);
554045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    }
564045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    void ReadDeclarationNameLoc(DeclarationNameLoc &DNLoc, DeclarationName Name,
574045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis                                const ASTReader::RecordData &R, unsigned &I) {
584045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis      Reader.ReadDeclarationNameLoc(F, DNLoc, Name, R, I);
594045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    }
604045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    void ReadDeclarationNameInfo(DeclarationNameInfo &NameInfo,
614045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis                                const ASTReader::RecordData &R, unsigned &I) {
624045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis      Reader.ReadDeclarationNameInfo(F, NameInfo, R, I);
634045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    }
64577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl
65698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  public:
66c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    ASTDeclReader(ASTReader &Reader, ASTReader::PerFileData &F,
67c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl                  llvm::BitstreamCursor &Cursor, DeclID thisDeclID,
68c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl                  const ASTReader::RecordData &Record, unsigned &Idx)
69c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      : Reader(Reader), F(F), Cursor(Cursor), ThisDeclID(thisDeclID),
70c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        Record(Record), Idx(Idx), TypeIDForTypeDecl(0) { }
71698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
72d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis    void Visit(Decl *D);
73d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis
74698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitDecl(Decl *D);
75698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitTranslationUnitDecl(TranslationUnitDecl *TU);
76698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitNamedDecl(NamedDecl *ND);
770cef483f3b9d6a7f9fdbc5910d0a3ed64130e8e1Douglas Gregor    void VisitNamespaceDecl(NamespaceDecl *D);
786ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitUsingDirectiveDecl(UsingDirectiveDecl *D);
796ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitNamespaceAliasDecl(NamespaceAliasDecl *D);
80698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitTypeDecl(TypeDecl *TD);
81698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitTypedefDecl(TypedefDecl *TD);
828f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidis    void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D);
83698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitTagDecl(TagDecl *TD);
84698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitEnumDecl(EnumDecl *ED);
85698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitRecordDecl(RecordDecl *RD);
866ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitCXXRecordDecl(CXXRecordDecl *D);
876ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitClassTemplateSpecializationDecl(
886ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                            ClassTemplateSpecializationDecl *D);
896ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitClassTemplatePartialSpecializationDecl(
906ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                     ClassTemplatePartialSpecializationDecl *D);
916ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);
92698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitValueDecl(ValueDecl *VD);
93698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitEnumConstantDecl(EnumConstantDecl *ECD);
948f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidis    void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D);
95d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis    void VisitDeclaratorDecl(DeclaratorDecl *DD);
96698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitFunctionDecl(FunctionDecl *FD);
976ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitCXXMethodDecl(CXXMethodDecl *D);
986ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitCXXConstructorDecl(CXXConstructorDecl *D);
996ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitCXXDestructorDecl(CXXDestructorDecl *D);
1006ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitCXXConversionDecl(CXXConversionDecl *D);
101698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitFieldDecl(FieldDecl *FD);
102698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitVarDecl(VarDecl *VD);
103698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitImplicitParamDecl(ImplicitParamDecl *PD);
104698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitParmVarDecl(ParmVarDecl *PD);
1056ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D);
1066ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitTemplateDecl(TemplateDecl *D);
1079eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne    void VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D);
1086ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitClassTemplateDecl(ClassTemplateDecl *D);
109f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    void VisitFunctionTemplateDecl(FunctionTemplateDecl *D);
1106ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);
111b01a552d7bafb889305affe83018563620aab326Argyrios Kyrtzidis    void VisitUsingDecl(UsingDecl *D);
112b01a552d7bafb889305affe83018563620aab326Argyrios Kyrtzidis    void VisitUsingShadowDecl(UsingShadowDecl *D);
1136ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitLinkageSpecDecl(LinkageSpecDecl *D);
114698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitFileScopeAsmDecl(FileScopeAsmDecl *AD);
1156206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara    void VisitAccessSpecDecl(AccessSpecDecl *D);
1166764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis    void VisitFriendDecl(FriendDecl *D);
1176ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitFriendTemplateDecl(FriendTemplateDecl *D);
1186ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitStaticAssertDecl(StaticAssertDecl *D);
119698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitBlockDecl(BlockDecl *BD);
1206ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
121698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    std::pair<uint64_t, uint64_t> VisitDeclContext(DeclContext *DC);
122a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    template <typename T> void VisitRedeclarable(Redeclarable<T> *D);
1236ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
1249a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt    // FIXME: Reorder according to DeclNodes.td?
125698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCMethodDecl(ObjCMethodDecl *D);
126698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCContainerDecl(ObjCContainerDecl *D);
127698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
128698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCIvarDecl(ObjCIvarDecl *D);
129698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCProtocolDecl(ObjCProtocolDecl *D);
130698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D);
131698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCClassDecl(ObjCClassDecl *D);
132698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D);
133698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCCategoryDecl(ObjCCategoryDecl *D);
134698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCImplDecl(ObjCImplDecl *D);
135698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D);
136698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCImplementationDecl(ObjCImplementationDecl *D);
137698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D);
138698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCPropertyDecl(ObjCPropertyDecl *D);
139698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D);
140698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  };
141698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
142698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
143d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redluint64_t ASTDeclReader::GetCurrentCursorOffset() {
144577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  uint64_t Off = 0;
145577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  for (unsigned I = 0, N = Reader.Chain.size(); I != N; ++I) {
146c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl    ASTReader::PerFileData &F = *Reader.Chain[N - I - 1];
147577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    if (&Cursor == &F.DeclsCursor) {
148577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl      Off += F.DeclsCursor.GetCurrentBitNo();
149577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl      break;
150577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    }
151577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    Off += F.SizeInBits;
152577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  }
153577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  return Off;
154577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl}
155577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl
156d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::Visit(Decl *D) {
157d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl  DeclVisitor<ASTDeclReader, void>::Visit(D);
158d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis
15991468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis  if (TypeDecl *TD = dyn_cast<TypeDecl>(D)) {
160deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor    // if we have a fully initialized TypeDecl, we can safely read its type now.
161deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor    TD->setTypeForDecl(Reader.GetType(TypeIDForTypeDecl).getTypePtr());
16291468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis  } else if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
16391468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis    // FunctionDecl's body was written last after all other Stmts/Exprs.
16491468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis    if (Record[Idx++])
165577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl      FD->setLazyBody(GetCurrentCursorOffset());
16691468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis  }
167d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis}
168d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis
169d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitDecl(Decl *D) {
170698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setDeclContext(cast_or_null<DeclContext>(Reader.GetDecl(Record[Idx++])));
171698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setLexicalDeclContext(
172698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                     cast_or_null<DeclContext>(Reader.GetDecl(Record[Idx++])));
173c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setLocation(ReadSourceLocation(Record, Idx));
174698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setInvalidDecl(Record[Idx++]);
1754eb9fc0449ddbd5239ddc3ae6b6e52880f47dcf7Argyrios Kyrtzidis  if (Record[Idx++]) { // hasAttrs
176cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt    AttrVec Attrs;
1774eb9fc0449ddbd5239ddc3ae6b6e52880f47dcf7Argyrios Kyrtzidis    Reader.ReadAttributes(F, Attrs, Record, Idx);
178cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt    D->setAttrs(Attrs);
179cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt  }
180698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setImplicit(Record[Idx++]);
181e0762c92110dfdcdd207db461a4ea17afd168f1eDouglas Gregor  D->setUsed(Record[Idx++]);
182698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setAccess((AccessSpecifier)Record[Idx++]);
1831d9f1fe7173e3084325f43c78af812a36d8a2a7cSebastian Redl  D->setPCHLevel(Record[Idx++] + (F.Type <= ASTReader::PCH));
184698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
185698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
186d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTranslationUnitDecl(TranslationUnitDecl *TU) {
187698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitDecl(TU);
1886ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  TU->setAnonymousNamespace(
1896ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                    cast_or_null<NamespaceDecl>(Reader.GetDecl(Record[Idx++])));
190698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
191698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
192d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitNamedDecl(NamedDecl *ND) {
193698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitDecl(ND);
1941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ND->setDeclName(Reader.ReadDeclarationName(Record, Idx));
195698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
196698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
197d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTypeDecl(TypeDecl *TD) {
198698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitNamedDecl(TD);
199d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis  // Delay type reading until after we have fully initialized the decl.
200deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  TypeIDForTypeDecl = Record[Idx++];
201698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
202698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
203d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTypedefDecl(TypedefDecl *TD) {
204d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis  VisitTypeDecl(TD);
205c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TD->setTypeSourceInfo(GetTypeSourceInfo(Record, Idx));
206698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
207698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
208d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTagDecl(TagDecl *TD) {
209698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitTypeDecl(TD);
210a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  VisitRedeclarable(TD);
2116b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  TD->IdentifierNamespace = Record[Idx++];
212698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  TD->setTagKind((TagDecl::TagKind)Record[Idx++]);
213698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  TD->setDefinition(Record[Idx++]);
214b37b648b3f2bba4c557a1604ced19b526b25a372Douglas Gregor  TD->setEmbeddedInDeclarator(Record[Idx++]);
215c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TD->setRBraceLoc(ReadSourceLocation(Record, Idx));
216c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TD->setTagKeywordLoc(ReadSourceLocation(Record, Idx));
2174045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  if (Record[Idx++]) { // hasExtInfo
2184045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    TagDecl::ExtInfo *Info = new (*Reader.getContext()) TagDecl::ExtInfo();
2194045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    ReadQualifierInfo(*Info, Record, Idx);
2204045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    TD->TypedefDeclOrQualifier = Info;
2214045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  } else
2224045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    TD->setTypedefForAnonDecl(
2234045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis                      cast_or_null<TypedefDecl>(Reader.GetDecl(Record[Idx++])));
224698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
225698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
226d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitEnumDecl(EnumDecl *ED) {
227698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitTagDecl(ED);
2281274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor  if (TypeSourceInfo *TI = Reader.GetTypeSourceInfo(F, Record, Idx))
2291274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor    ED->setIntegerTypeSourceInfo(TI);
2301274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor  else
2311274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor    ED->setIntegerType(Reader.GetType(Record[Idx++]));
232842aef8d942a880eeb9535d40de31a86838264cbJohn McCall  ED->setPromotionType(Reader.GetType(Record[Idx++]));
2331b5a618c59025898806160ed5e7f0ff5bb79e482John McCall  ED->setNumPositiveBits(Record[Idx++]);
2341b5a618c59025898806160ed5e7f0ff5bb79e482John McCall  ED->setNumNegativeBits(Record[Idx++]);
2351274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor  ED->IsScoped = Record[Idx++];
2361274ccd90aec0b205fc838c3d504821ccfb55482Douglas Gregor  ED->IsFixed = Record[Idx++];
23774228274ba9b27a26a311010b02c371f558e3bfcArgyrios Kyrtzidis  ED->setInstantiationOfMemberEnum(
23874228274ba9b27a26a311010b02c371f558e3bfcArgyrios Kyrtzidis                         cast_or_null<EnumDecl>(Reader.GetDecl(Record[Idx++])));
239698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
240698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
241d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitRecordDecl(RecordDecl *RD) {
242698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitTagDecl(RD);
243698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  RD->setHasFlexibleArrayMember(Record[Idx++]);
244698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  RD->setAnonymousStructOrUnion(Record[Idx++]);
245643b7dfb7803003d62e18da65cbe81ad001851b7Fariborz Jahanian  RD->setHasObjectMember(Record[Idx++]);
246698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
247698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
248d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitValueDecl(ValueDecl *VD) {
249698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitNamedDecl(VD);
250698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VD->setType(Reader.GetType(Record[Idx++]));
251698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
252698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
253d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitEnumConstantDecl(EnumConstantDecl *ECD) {
254698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitValueDecl(ECD);
255698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  if (Record[Idx++])
256c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    ECD->setInitExpr(Reader.ReadExpr(F));
257698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  ECD->setInitVal(Reader.ReadAPSInt(Record, Idx));
258698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
259698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
260d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitDeclaratorDecl(DeclaratorDecl *DD) {
261d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis  VisitValueDecl(DD);
2624045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  if (Record[Idx++]) { // hasExtInfo
2634045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    DeclaratorDecl::ExtInfo *Info
2644045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis        = new (*Reader.getContext()) DeclaratorDecl::ExtInfo();
2654045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    ReadQualifierInfo(*Info, Record, Idx);
2664045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    Info->TInfo = GetTypeSourceInfo(Record, Idx);
2674045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    DD->DeclInfo = Info;
2684045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  } else
2694045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    DD->DeclInfo = GetTypeSourceInfo(Record, Idx);
270d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis}
271d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis
272d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFunctionDecl(FunctionDecl *FD) {
273d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis  VisitDeclaratorDecl(FD);
2746b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  VisitRedeclarable(FD);
2756ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
2764045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  ReadDeclarationNameLoc(FD->DNLoc, FD->getDeclName(), Record, Idx);
277c8f9af2943699ff623ca08f2e5ed4d72e0351189Argyrios Kyrtzidis  FD->IdentifierNamespace = Record[Idx++];
278f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  switch ((FunctionDecl::TemplatedKind)Record[Idx++]) {
279dc767e368471288bef8716d19b0e929647246bfcArgyrios Kyrtzidis  default: assert(false && "Unhandled TemplatedKind!");
280dc767e368471288bef8716d19b0e929647246bfcArgyrios Kyrtzidis    break;
281f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  case FunctionDecl::TK_NonTemplate:
282f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    break;
283f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  case FunctionDecl::TK_FunctionTemplate:
284f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    FD->setDescribedFunctionTemplate(
285f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis                     cast<FunctionTemplateDecl>(Reader.GetDecl(Record[Idx++])));
286f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    break;
287f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  case FunctionDecl::TK_MemberSpecialization: {
288f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    FunctionDecl *InstFD = cast<FunctionDecl>(Reader.GetDecl(Record[Idx++]));
289f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++];
290c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SourceLocation POI = ReadSourceLocation(Record, Idx);
2916b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis    FD->setInstantiationOfMemberFunction(*Reader.getContext(), InstFD, TSK);
292f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    FD->getMemberSpecializationInfo()->setPointOfInstantiation(POI);
293f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    break;
294f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  }
295f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  case FunctionDecl::TK_FunctionTemplateSpecialization: {
296f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    FunctionTemplateDecl *Template
297f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis      = cast<FunctionTemplateDecl>(Reader.GetDecl(Record[Idx++]));
298f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++];
299f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis
300f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    // Template arguments.
301f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    llvm::SmallVector<TemplateArgument, 8> TemplArgs;
302c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    Reader.ReadTemplateArgumentList(TemplArgs, F, Record, Idx);
303f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis
304f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    // Template args as written.
305f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    llvm::SmallVector<TemplateArgumentLoc, 8> TemplArgLocs;
306f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    SourceLocation LAngleLoc, RAngleLoc;
3075efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis    if (Record[Idx++]) {  // TemplateArgumentsAsWritten != 0
3085efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis      unsigned NumTemplateArgLocs = Record[Idx++];
3095efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis      TemplArgLocs.reserve(NumTemplateArgLocs);
3105efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis      for (unsigned i=0; i != NumTemplateArgLocs; ++i)
311577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl        TemplArgLocs.push_back(
312c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl            Reader.ReadTemplateArgumentLoc(F, Record, Idx));
3135efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis
314c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      LAngleLoc = ReadSourceLocation(Record, Idx);
315c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      RAngleLoc = ReadSourceLocation(Record, Idx);
316f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    }
3177b081c8604efd33bc7f7e5c1e9427a031eedb2b4Argyrios Kyrtzidis
318c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SourceLocation POI = ReadSourceLocation(Record, Idx);
319f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis
320a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis    ASTContext &C = *Reader.getContext();
321a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis    TemplateArgumentList *TemplArgList
322a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis      = new (C) TemplateArgumentList(C, TemplArgs.data(), TemplArgs.size());
323a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis    TemplateArgumentListInfo *TemplArgsInfo
324a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis      = new (C) TemplateArgumentListInfo(LAngleLoc, RAngleLoc);
325a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis    for (unsigned i=0, e = TemplArgLocs.size(); i != e; ++i)
326a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis      TemplArgsInfo->addArgument(TemplArgLocs[i]);
327a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis    FunctionTemplateSpecializationInfo *FTInfo
328a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis        = FunctionTemplateSpecializationInfo::Create(C, FD, Template, TSK,
329a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis                                                     TemplArgList,
330a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis                                                     TemplArgsInfo, POI);
331a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis    FD->TemplateOrSpecialization = FTInfo;
3326b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis
333a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis    if (FD->isCanonicalDecl()) { // if canonical add to template's set.
33499a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis      // The template that contains the specializations set. It's not safe to
33599a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis      // use getCanonicalDecl on Template since it may still be initializing.
33699a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis      FunctionTemplateDecl *CanonTemplate
33799a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis        = cast<FunctionTemplateDecl>(Reader.GetDecl(Record[Idx++]));
338a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis      // Get the InsertPos by FindNodeOrInsertPos() instead of calling
339a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis      // InsertNode(FTInfo) directly to avoid the getASTContext() call in
340a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis      // FunctionTemplateSpecializationInfo's Profile().
341a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis      // We avoid getASTContext because a decl in the parent hierarchy may
342a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis      // be initializing.
3436b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis      llvm::FoldingSetNodeID ID;
3446b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis      FunctionTemplateSpecializationInfo::Profile(ID, TemplArgs.data(),
3456b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis                                                  TemplArgs.size(), C);
3466b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis      void *InsertPos = 0;
34799a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis      CanonTemplate->getSpecializations().FindNodeOrInsertPos(ID, InsertPos);
348a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis      assert(InsertPos && "Another specialization already inserted!");
34999a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis      CanonTemplate->getSpecializations().InsertNode(FTInfo, InsertPos);
3506b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis    }
351dc767e368471288bef8716d19b0e929647246bfcArgyrios Kyrtzidis    break;
352f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  }
353f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  case FunctionDecl::TK_DependentFunctionTemplateSpecialization: {
354f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    // Templates.
355f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    UnresolvedSet<8> TemplDecls;
356f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    unsigned NumTemplates = Record[Idx++];
357f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    while (NumTemplates--)
358f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis      TemplDecls.addDecl(cast<NamedDecl>(Reader.GetDecl(Record[Idx++])));
359f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis
360f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    // Templates args.
361f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    TemplateArgumentListInfo TemplArgs;
362f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    unsigned NumArgs = Record[Idx++];
363f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    while (NumArgs--)
364c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      TemplArgs.addArgument(Reader.ReadTemplateArgumentLoc(F, Record, Idx));
365c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    TemplArgs.setLAngleLoc(ReadSourceLocation(Record, Idx));
366c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    TemplArgs.setRAngleLoc(ReadSourceLocation(Record, Idx));
367f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis
368f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    FD->setDependentTemplateSpecialization(*Reader.getContext(),
369f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis                                           TemplDecls, TemplArgs);
370dc767e368471288bef8716d19b0e929647246bfcArgyrios Kyrtzidis    break;
371f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  }
372f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  }
3735efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis
374d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl  // FunctionDecl's body is handled last at ASTDeclReader::Visit,
37591468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis  // after everything else is read.
37691468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis
377d931b086984257de68868a64a235c2b4b34003fbJohn McCall  FD->setStorageClass((StorageClass)Record[Idx++]);
378d931b086984257de68868a64a235c2b4b34003fbJohn McCall  FD->setStorageClassAsWritten((StorageClass)Record[Idx++]);
3795efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis  FD->setInlineSpecified(Record[Idx++]);
3805efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis  FD->setVirtualAsWritten(Record[Idx++]);
3815efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis  FD->setPure(Record[Idx++]);
3825efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis  FD->setHasInheritedPrototype(Record[Idx++]);
3835efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis  FD->setHasWrittenPrototype(Record[Idx++]);
3845efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis  FD->setDeleted(Record[Idx++]);
3855efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis  FD->setTrivial(Record[Idx++]);
3865efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis  FD->setHasImplicitReturnZero(Record[Idx++]);
387c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  FD->setLocEnd(ReadSourceLocation(Record, Idx));
3885efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis
3896ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  // Read in the parameters.
390698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned NumParams = Record[Idx++];
391698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  llvm::SmallVector<ParmVarDecl *, 16> Params;
392698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  Params.reserve(NumParams);
393698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  for (unsigned I = 0; I != NumParams; ++I)
394698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    Params.push_back(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++])));
3956b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  FD->setParams(*Reader.getContext(), Params.data(), NumParams);
396698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
397698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
398d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCMethodDecl(ObjCMethodDecl *MD) {
399698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitNamedDecl(MD);
400698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  if (Record[Idx++]) {
401698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    // In practice, this won't be executed (since method definitions
402698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    // don't occur in header files).
403c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    MD->setBody(Reader.ReadStmt(F));
404698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    MD->setSelfDecl(cast<ImplicitParamDecl>(Reader.GetDecl(Record[Idx++])));
405698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    MD->setCmdDecl(cast<ImplicitParamDecl>(Reader.GetDecl(Record[Idx++])));
406698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  }
407698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  MD->setInstanceMethod(Record[Idx++]);
408698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  MD->setVariadic(Record[Idx++]);
409698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  MD->setSynthesized(Record[Idx++]);
4103fe104154dd2e8ffb351142d74f308938b5c99bfFariborz Jahanian  MD->setDefined(Record[Idx++]);
411698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  MD->setDeclImplementation((ObjCMethodDecl::ImplementationControl)Record[Idx++]);
412698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  MD->setObjCDeclQualifier((Decl::ObjCDeclQualifier)Record[Idx++]);
4137732cc9c0fdc97a2f8cce4e5933d8103213d1aefFariborz Jahanian  MD->setNumSelectorArgs(unsigned(Record[Idx++]));
414698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  MD->setResultType(Reader.GetType(Record[Idx++]));
415c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  MD->setResultTypeSourceInfo(GetTypeSourceInfo(Record, Idx));
416c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  MD->setEndLoc(ReadSourceLocation(Record, Idx));
417698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned NumParams = Record[Idx++];
418698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  llvm::SmallVector<ParmVarDecl *, 16> Params;
419698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  Params.reserve(NumParams);
420698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  for (unsigned I = 0; I != NumParams; ++I)
421698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    Params.push_back(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++])));
4224ecb25fa94897b2c03510292acace710e5262ba5Fariborz Jahanian  MD->setMethodParams(*Reader.getContext(), Params.data(), NumParams,
4234ecb25fa94897b2c03510292acace710e5262ba5Fariborz Jahanian                      NumParams);
424698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
425698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
426d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCContainerDecl(ObjCContainerDecl *CD) {
427698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitNamedDecl(CD);
428c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  SourceLocation A = ReadSourceLocation(Record, Idx);
429c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  SourceLocation B = ReadSourceLocation(Record, Idx);
430782f2f52b78d8ca785110398a7f7b56b830b9ac7Ted Kremenek  CD->setAtEndRange(SourceRange(A, B));
431698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
432698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
433d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCInterfaceDecl(ObjCInterfaceDecl *ID) {
434698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitObjCContainerDecl(ID);
435deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  ID->setTypeForDecl(Reader.GetType(Record[Idx++]).getTypePtr());
436698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  ID->setSuperClass(cast_or_null<ObjCInterfaceDecl>
437698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                       (Reader.GetDecl(Record[Idx++])));
43853b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek
43953b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek  // Read the directly referenced protocols and their SourceLocations.
440698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned NumProtocols = Record[Idx++];
441698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  llvm::SmallVector<ObjCProtocolDecl *, 16> Protocols;
442698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  Protocols.reserve(NumProtocols);
443698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  for (unsigned I = 0; I != NumProtocols; ++I)
444698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    Protocols.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++])));
44518df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  llvm::SmallVector<SourceLocation, 16> ProtoLocs;
44618df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  ProtoLocs.reserve(NumProtocols);
44718df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  for (unsigned I = 0; I != NumProtocols; ++I)
448c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    ProtoLocs.push_back(ReadSourceLocation(Record, Idx));
44918df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  ID->setProtocolList(Protocols.data(), NumProtocols, ProtoLocs.data(),
45018df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor                      *Reader.getContext());
45153b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek
45253b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek  // Read the transitive closure of protocols referenced by this class.
45353b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek  NumProtocols = Record[Idx++];
45453b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek  Protocols.clear();
45553b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek  Protocols.reserve(NumProtocols);
45653b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek  for (unsigned I = 0; I != NumProtocols; ++I)
45753b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek    Protocols.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++])));
45853b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek  ID->AllReferencedProtocols.set(Protocols.data(), NumProtocols,
45953b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek                                 *Reader.getContext());
46053b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek
46153b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek  // Read the ivars.
462698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned NumIvars = Record[Idx++];
463698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  llvm::SmallVector<ObjCIvarDecl *, 16> IVars;
464698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  IVars.reserve(NumIvars);
465698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  for (unsigned I = 0; I != NumIvars; ++I)
466698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    IVars.push_back(cast<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++])));
467698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  ID->setCategoryList(
468698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner               cast_or_null<ObjCCategoryDecl>(Reader.GetDecl(Record[Idx++])));
4692c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian  // We will rebuild this list lazily.
4702c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian  ID->setIvarList(0);
471deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  ID->setForwardDecl(Record[Idx++]);
472deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  ID->setImplicitInterfaceDecl(Record[Idx++]);
473c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  ID->setClassLoc(ReadSourceLocation(Record, Idx));
474c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  ID->setSuperClassLoc(ReadSourceLocation(Record, Idx));
475c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  ID->setLocEnd(ReadSourceLocation(Record, Idx));
476698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
477698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
478d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCIvarDecl(ObjCIvarDecl *IVD) {
479698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitFieldDecl(IVD);
480698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  IVD->setAccessControl((ObjCIvarDecl::AccessControl)Record[Idx++]);
4812c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian  // This field will be built lazily.
4822c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian  IVD->setNextIvar(0);
483ac0021ba802e193e0f9f8207768c7862c7603bc0Fariborz Jahanian  bool synth = Record[Idx++];
484ac0021ba802e193e0f9f8207768c7862c7603bc0Fariborz Jahanian  IVD->setSynthesize(synth);
485698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
486698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
487d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCProtocolDecl(ObjCProtocolDecl *PD) {
488698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitObjCContainerDecl(PD);
489698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  PD->setForwardDecl(Record[Idx++]);
490c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  PD->setLocEnd(ReadSourceLocation(Record, Idx));
491698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned NumProtoRefs = Record[Idx++];
492698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  llvm::SmallVector<ObjCProtocolDecl *, 16> ProtoRefs;
493698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  ProtoRefs.reserve(NumProtoRefs);
494698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  for (unsigned I = 0; I != NumProtoRefs; ++I)
495698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    ProtoRefs.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++])));
49618df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  llvm::SmallVector<SourceLocation, 16> ProtoLocs;
49718df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  ProtoLocs.reserve(NumProtoRefs);
49818df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  for (unsigned I = 0; I != NumProtoRefs; ++I)
499c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    ProtoLocs.push_back(ReadSourceLocation(Record, Idx));
50018df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  PD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(),
50118df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor                      *Reader.getContext());
502698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
503698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
504d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *FD) {
505698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitFieldDecl(FD);
506698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
507698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
508d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCClassDecl(ObjCClassDecl *CD) {
509698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitDecl(CD);
510698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned NumClassRefs = Record[Idx++];
511698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  llvm::SmallVector<ObjCInterfaceDecl *, 16> ClassRefs;
512698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  ClassRefs.reserve(NumClassRefs);
513698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  for (unsigned I = 0; I != NumClassRefs; ++I)
514698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    ClassRefs.push_back(cast<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])));
515321c22f1c4271c3d9a3d4d3fc18847f948ab595bTed Kremenek  llvm::SmallVector<SourceLocation, 16> SLocs;
516321c22f1c4271c3d9a3d4d3fc18847f948ab595bTed Kremenek  SLocs.reserve(NumClassRefs);
517321c22f1c4271c3d9a3d4d3fc18847f948ab595bTed Kremenek  for (unsigned I = 0; I != NumClassRefs; ++I)
518c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SLocs.push_back(ReadSourceLocation(Record, Idx));
519321c22f1c4271c3d9a3d4d3fc18847f948ab595bTed Kremenek  CD->setClassList(*Reader.getContext(), ClassRefs.data(), SLocs.data(),
520321c22f1c4271c3d9a3d4d3fc18847f948ab595bTed Kremenek                   NumClassRefs);
521698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
522698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
523d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *FPD) {
524698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitDecl(FPD);
525698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned NumProtoRefs = Record[Idx++];
526698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  llvm::SmallVector<ObjCProtocolDecl *, 16> ProtoRefs;
527698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  ProtoRefs.reserve(NumProtoRefs);
528698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  for (unsigned I = 0; I != NumProtoRefs; ++I)
529698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    ProtoRefs.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++])));
53018df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  llvm::SmallVector<SourceLocation, 16> ProtoLocs;
53118df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  ProtoLocs.reserve(NumProtoRefs);
53218df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  for (unsigned I = 0; I != NumProtoRefs; ++I)
533c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    ProtoLocs.push_back(ReadSourceLocation(Record, Idx));
53418df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  FPD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(),
53518df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor                       *Reader.getContext());
536698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
537698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
538d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCCategoryDecl(ObjCCategoryDecl *CD) {
539698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitObjCContainerDecl(CD);
540698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  CD->setClassInterface(cast<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])));
541698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned NumProtoRefs = Record[Idx++];
542698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  llvm::SmallVector<ObjCProtocolDecl *, 16> ProtoRefs;
543698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  ProtoRefs.reserve(NumProtoRefs);
544698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  for (unsigned I = 0; I != NumProtoRefs; ++I)
545698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    ProtoRefs.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++])));
54618df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  llvm::SmallVector<SourceLocation, 16> ProtoLocs;
54718df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  ProtoLocs.reserve(NumProtoRefs);
54818df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  for (unsigned I = 0; I != NumProtoRefs; ++I)
549c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    ProtoLocs.push_back(ReadSourceLocation(Record, Idx));
55018df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  CD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(),
55118df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor                      *Reader.getContext());
552698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  CD->setNextClassCategory(cast_or_null<ObjCCategoryDecl>(Reader.GetDecl(Record[Idx++])));
553000835d0b04345c0014c603fe6339b3bc154050eFariborz Jahanian  CD->setHasSynthBitfield(Record[Idx++]);
554c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  CD->setAtLoc(ReadSourceLocation(Record, Idx));
555c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  CD->setCategoryNameLoc(ReadSourceLocation(Record, Idx));
556698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
557698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
558d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *CAD) {
559698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitNamedDecl(CAD);
560698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  CAD->setClassInterface(cast<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])));
561698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
562698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
563d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
564698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitNamedDecl(D);
565c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setAtLoc(ReadSourceLocation(Record, Idx));
566c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setType(GetTypeSourceInfo(Record, Idx));
567698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  // FIXME: stable encoding
568698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setPropertyAttributes(
569698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                      (ObjCPropertyDecl::PropertyAttributeKind)Record[Idx++]);
57080aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian  D->setPropertyAttributesAsWritten(
57180aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian                      (ObjCPropertyDecl::PropertyAttributeKind)Record[Idx++]);
572698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  // FIXME: stable encoding
573698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setPropertyImplementation(
574698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                            (ObjCPropertyDecl::PropertyControl)Record[Idx++]);
575698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setGetterName(Reader.ReadDeclarationName(Record, Idx).getObjCSelector());
576698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setSetterName(Reader.ReadDeclarationName(Record, Idx).getObjCSelector());
577698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setGetterMethodDecl(
578698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                 cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++])));
579698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setSetterMethodDecl(
580698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                 cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++])));
581698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setPropertyIvarDecl(
582698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                   cast_or_null<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++])));
583698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
584698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
585d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCImplDecl(ObjCImplDecl *D) {
586aecae629269fae3bf484baf1d109e9a89d14eeadArgyrios Kyrtzidis  VisitObjCContainerDecl(D);
587698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setClassInterface(
588698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner              cast_or_null<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])));
589698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
590698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
591d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
592698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitObjCImplDecl(D);
593698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setIdentifier(Reader.GetIdentifierInfo(Record, Idx));
594698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
595698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
596d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
597698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitObjCImplDecl(D);
598698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setSuperClass(
599698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner              cast_or_null<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])));
6009d50c0635fb213b2a1857e3f8488580f0dab2f98Argyrios Kyrtzidis  llvm::tie(D->IvarInitializers, D->NumIvarInitializers)
601c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      = Reader.ReadCXXBaseOrMemberInitializers(F, Record, Idx);
602000835d0b04345c0014c603fe6339b3bc154050eFariborz Jahanian  D->setHasSynthBitfield(Record[Idx++]);
603698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
604698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
605698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
606d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {
607698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitDecl(D);
608c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setAtLoc(ReadSourceLocation(Record, Idx));
609698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setPropertyDecl(
610698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner               cast_or_null<ObjCPropertyDecl>(Reader.GetDecl(Record[Idx++])));
611698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setPropertyIvarDecl(
612698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                   cast_or_null<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++])));
613c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setGetterCXXConstructor(Reader.ReadExpr(F));
614c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setSetterCXXAssignment(Reader.ReadExpr(F));
615698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
616698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
617d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFieldDecl(FieldDecl *FD) {
618d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis  VisitDeclaratorDecl(FD);
619698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  FD->setMutable(Record[Idx++]);
620698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  if (Record[Idx++])
621c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    FD->setBitWidth(Reader.ReadExpr(F));
622c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  if (!FD->getDeclName()) {
623c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis    FieldDecl *Tmpl = cast_or_null<FieldDecl>(Reader.GetDecl(Record[Idx++]));
624c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis    if (Tmpl)
625c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis      Reader.getContext()->setInstantiatedFromUnnamedFieldDecl(FD, Tmpl);
626c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  }
627698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
628698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
629d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitVarDecl(VarDecl *VD) {
630d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis  VisitDeclaratorDecl(VD);
6316b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  VisitRedeclarable(VD);
632d931b086984257de68868a64a235c2b4b34003fbJohn McCall  VD->setStorageClass((StorageClass)Record[Idx++]);
633d931b086984257de68868a64a235c2b4b34003fbJohn McCall  VD->setStorageClassAsWritten((StorageClass)Record[Idx++]);
634698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VD->setThreadSpecified(Record[Idx++]);
635698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VD->setCXXDirectInitializer(Record[Idx++]);
636324b54d3f60d92a82815512119791ce1c285b63eDouglas Gregor  VD->setExceptionVariable(Record[Idx++]);
6375077c3876beeaed32280af88244e8050078619a8Douglas Gregor  VD->setNRVOVariable(Record[Idx++]);
638698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  if (Record[Idx++])
639c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    VD->setInit(Reader.ReadExpr(F));
6409421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis
6419421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis  if (Record[Idx++]) { // HasMemberSpecializationInfo.
6429421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis    VarDecl *Tmpl = cast<VarDecl>(Reader.GetDecl(Record[Idx++]));
6439421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis    TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++];
644c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SourceLocation POI = ReadSourceLocation(Record, Idx);
6459421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis    Reader.getContext()->setInstantiatedFromStaticDataMember(VD, Tmpl, TSK,POI);
6469421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis  }
647698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
648698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
649d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitImplicitParamDecl(ImplicitParamDecl *PD) {
650698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitVarDecl(PD);
651698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
652698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
653d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitParmVarDecl(ParmVarDecl *PD) {
654698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitVarDecl(PD);
655698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  PD->setObjCDeclQualifier((Decl::ObjCDeclQualifier)Record[Idx++]);
656bf73b352acb7a2d041ce8b50171dd7f8e2b2c1bbJohn McCall  PD->setHasInheritedDefaultArg(Record[Idx++]);
657691d77f20763915fc7c9b34e29939d225fd0b4d2Argyrios Kyrtzidis  if (Record[Idx++]) // hasUninstantiatedDefaultArg.
658c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    PD->setUninstantiatedDefaultArg(Reader.ReadExpr(F));
659698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
660698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
661d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFileScopeAsmDecl(FileScopeAsmDecl *AD) {
662698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitDecl(AD);
663c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  AD->setAsmString(cast<StringLiteral>(Reader.ReadExpr(F)));
664698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
665698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
666d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitBlockDecl(BlockDecl *BD) {
667698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitDecl(BD);
668c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  BD->setBody(cast_or_null<CompoundStmt>(Reader.ReadStmt(F)));
669c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  BD->setSignatureAsWritten(GetTypeSourceInfo(Record, Idx));
670698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned NumParams = Record[Idx++];
671698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  llvm::SmallVector<ParmVarDecl *, 16> Params;
672698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  Params.reserve(NumParams);
673698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  for (unsigned I = 0; I != NumParams; ++I)
674698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    Params.push_back(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++])));
675838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor  BD->setParams(Params.data(), NumParams);
676698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
677698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
678d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
6796ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitDecl(D);
6806ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  D->setLanguage((LinkageSpecDecl::LanguageIDs)Record[Idx++]);
6816ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  D->setHasBraces(Record[Idx++]);
6826ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
6836ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
684d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitNamespaceDecl(NamespaceDecl *D) {
6856ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitNamedDecl(D);
6860a0c3e72ce42f84f361c285e6963d44213ab6beaDouglas Gregor  D->IsInline = Record[Idx++];
687c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setLBracLoc(ReadSourceLocation(Record, Idx));
688c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setRBracLoc(ReadSourceLocation(Record, Idx));
6896ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  D->setNextNamespace(
6906ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                    cast_or_null<NamespaceDecl>(Reader.GetDecl(Record[Idx++])));
6916ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
6926ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  bool IsOriginal = Record[Idx++];
693a038c1dcface5a404d540a0d0688962cbe656af9Argyrios Kyrtzidis  D->OrigOrAnonNamespace.setInt(IsOriginal);
694a038c1dcface5a404d540a0d0688962cbe656af9Argyrios Kyrtzidis  D->OrigOrAnonNamespace.setPointer(
6956ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                    cast_or_null<NamespaceDecl>(Reader.GetDecl(Record[Idx++])));
6966ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
6976ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
698d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
6996ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitNamedDecl(D);
700c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->NamespaceLoc = ReadSourceLocation(Record, Idx);
701c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setQualifierRange(ReadSourceRange(Record, Idx));
7026ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  D->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx));
703c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->IdentLoc = ReadSourceLocation(Record, Idx);
7048ea5b9d832455247a15925398fb663d299d33238Douglas Gregor  D->Namespace = cast<NamedDecl>(Reader.GetDecl(Record[Idx++]));
7056ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
7066ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
707d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitUsingDecl(UsingDecl *D) {
7086ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitNamedDecl(D);
709c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setUsingLocation(ReadSourceLocation(Record, Idx));
710c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setNestedNameRange(ReadSourceRange(Record, Idx));
7116ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  D->setTargetNestedNameDecl(Reader.ReadNestedNameSpecifier(Record, Idx));
7124045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  ReadDeclarationNameLoc(D->DNLoc, D->getDeclName(), Record, Idx);
7136ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
7146ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  // FIXME: It would probably be more efficient to read these into a vector
7156ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  // and then re-cosntruct the shadow decl set over that vector since it
7166ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  // would avoid existence checks.
7176ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  unsigned NumShadows = Record[Idx++];
7186ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  for(unsigned I = 0; I != NumShadows; ++I) {
71982f8e796d6ffce1d63729a2df87c1060edf6593aArgyrios Kyrtzidis    // Avoid invariant checking of UsingDecl::addShadowDecl, the decl may still
72082f8e796d6ffce1d63729a2df87c1060edf6593aArgyrios Kyrtzidis    // be initializing.
72182f8e796d6ffce1d63729a2df87c1060edf6593aArgyrios Kyrtzidis    D->Shadows.insert(cast<UsingShadowDecl>(Reader.GetDecl(Record[Idx++])));
7226ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  }
7236ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  D->setTypeName(Record[Idx++]);
724c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  NamedDecl *Pattern = cast_or_null<NamedDecl>(Reader.GetDecl(Record[Idx++]));
725c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  if (Pattern)
726c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis    Reader.getContext()->setInstantiatedFromUsingDecl(D, Pattern);
7276ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
7286ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
729d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitUsingShadowDecl(UsingShadowDecl *D) {
7306ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitNamedDecl(D);
7316ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  D->setTargetDecl(cast<NamedDecl>(Reader.GetDecl(Record[Idx++])));
7326ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  D->setUsingDecl(cast<UsingDecl>(Reader.GetDecl(Record[Idx++])));
733c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  UsingShadowDecl *Pattern
734c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis      = cast_or_null<UsingShadowDecl>(Reader.GetDecl(Record[Idx++]));
735c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  if (Pattern)
736c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis    Reader.getContext()->setInstantiatedFromUsingShadowDecl(D, Pattern);
7376ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
7386ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
739d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {
7406ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitNamedDecl(D);
741c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->UsingLoc = ReadSourceLocation(Record, Idx);
742c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->NamespaceLoc = ReadSourceLocation(Record, Idx);
743c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->QualifierRange = ReadSourceRange(Record, Idx);
7440a35bceb7768fc0be62cb644a4e31d8bfd9fb44aDouglas Gregor  D->Qualifier = Reader.ReadNestedNameSpecifier(Record, Idx);
7450a35bceb7768fc0be62cb644a4e31d8bfd9fb44aDouglas Gregor  D->NominatedNamespace = cast<NamedDecl>(Reader.GetDecl(Record[Idx++]));
7460a35bceb7768fc0be62cb644a4e31d8bfd9fb44aDouglas Gregor  D->CommonAncestor = cast_or_null<DeclContext>(Reader.GetDecl(Record[Idx++]));
7476ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
7486ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
749d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) {
7506ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitValueDecl(D);
751c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setTargetNestedNameRange(ReadSourceRange(Record, Idx));
752c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setUsingLoc(ReadSourceLocation(Record, Idx));
7536ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  D->setTargetNestedNameSpecifier(Reader.ReadNestedNameSpecifier(Record, Idx));
7544045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  ReadDeclarationNameLoc(D->DNLoc, D->getDeclName(), Record, Idx);
7556ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
7566ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
757d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitUnresolvedUsingTypenameDecl(
7586ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                               UnresolvedUsingTypenameDecl *D) {
7596ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitTypeDecl(D);
760c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->TargetNestedNameRange = ReadSourceRange(Record, Idx);
761c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->UsingLocation = ReadSourceLocation(Record, Idx);
762c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->TypenameLocation = ReadSourceLocation(Record, Idx);
7637e24256c95afb64b4d5abf201a0f9f0527cb4cf3Douglas Gregor  D->TargetNestedNameSpecifier = Reader.ReadNestedNameSpecifier(Record, Idx);
7646ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
7656ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
766d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitCXXRecordDecl(CXXRecordDecl *D) {
76737ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis  ASTContext &C = *Reader.getContext();
76837ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis
7690f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis  // We need to allocate the DefinitionData struct ahead of VisitRecordDecl
7700f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis  // so that the other CXXRecordDecls can get a pointer even when the owner
7710f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis  // is still initializing.
7720f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis  bool OwnsDefinitionData = false;
7730f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis  enum DataOwnership { Data_NoDefData, Data_Owner, Data_NotOwner };
7740f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis  switch ((DataOwnership)Record[Idx++]) {
7750f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis  default:
776d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl    assert(0 && "Out of sync with ASTDeclWriter or messed up reading");
7770f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis  case Data_NoDefData:
7780f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    break;
7790f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis  case Data_Owner:
7800f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    OwnsDefinitionData = true;
7810f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    D->DefinitionData = new (C) struct CXXRecordDecl::DefinitionData(D);
7820f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    break;
7830f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis  case Data_NotOwner:
7840f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    D->DefinitionData
7850f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis        = cast<CXXRecordDecl>(Reader.GetDecl(Record[Idx++]))->DefinitionData;
7860f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    break;
7870f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis  }
7880f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis
7890f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis  VisitRecordDecl(D);
7900f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis
7919703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis  if (D->DefinitionData) {
7929703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis    // Synchronize the DefinitionData pointer among all redeclarations.
7939703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis    // This synchronization ends up being done multiple times but it's necessary
7949703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis    // because a chained PCH may introduce a definition that earlier
7959703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis    // redeclarations in another PCH have no information about.
7969703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis    llvm::SmallPtrSet<CXXRecordDecl *, 16> PrevRedecls;
7979703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis    PrevRedecls.insert(D);
7989703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis    CXXRecordDecl *Redecl = cast<CXXRecordDecl>(D->RedeclLink.getNext());
7999703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis    while (!PrevRedecls.count(Redecl)) {
8009703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis      PrevRedecls.insert(Redecl);
8019703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis      assert((!Redecl->DefinitionData ||
8029703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis              Redecl->DefinitionData == D->DefinitionData) &&
8039703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis             "Multiple definitions in the redeclaration chain ?");
8049703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis      Redecl->DefinitionData = D->DefinitionData;
8059703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis      Redecl = cast<CXXRecordDecl>(Redecl->RedeclLink.getNext());
8069703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis    }
8079703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis  }
8089703b0dd353b928b2312076f13e30950e05d5fa1Argyrios Kyrtzidis
8090f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis  if (OwnsDefinitionData) {
8100f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    assert(D->DefinitionData);
8110f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    struct CXXRecordDecl::DefinitionData &Data = *D->DefinitionData;
8120f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis
8130f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.UserDeclaredConstructor = Record[Idx++];
8140f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.UserDeclaredCopyConstructor = Record[Idx++];
8150f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.UserDeclaredCopyAssignment = Record[Idx++];
8160f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.UserDeclaredDestructor = Record[Idx++];
8170f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.Aggregate = Record[Idx++];
8180f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.PlainOldData = Record[Idx++];
8190f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.Empty = Record[Idx++];
8200f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.Polymorphic = Record[Idx++];
8210f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.Abstract = Record[Idx++];
8220f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.HasTrivialConstructor = Record[Idx++];
8230f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.HasTrivialCopyConstructor = Record[Idx++];
8240f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.HasTrivialCopyAssignment = Record[Idx++];
8250f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.HasTrivialDestructor = Record[Idx++];
8260f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.ComputedVisibleConversions = Record[Idx++];
8270f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.DeclaredDefaultConstructor = Record[Idx++];
8280f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.DeclaredCopyConstructor = Record[Idx++];
8290f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.DeclaredCopyAssignment = Record[Idx++];
8300f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.DeclaredDestructor = Record[Idx++];
8310f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis
8320f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    // setBases() is unsuitable since it may try to iterate the bases of an
8335606220447c7901ba8d80147ddab893bb7949dd5Nick Lewycky    // uninitialized base.
8340f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.NumBases = Record[Idx++];
8350f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.Bases = new(C) CXXBaseSpecifier [Data.NumBases];
8360f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    for (unsigned i = 0; i != Data.NumBases; ++i)
837c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      Data.Bases[i] = Reader.ReadCXXBaseSpecifier(F, Record, Idx);
8380f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis
8390f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    // FIXME: Make VBases lazily computed when needed to avoid storing them.
8400f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.NumVBases = Record[Idx++];
8410f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.VBases = new(C) CXXBaseSpecifier [Data.NumVBases];
8420f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    for (unsigned i = 0; i != Data.NumVBases; ++i)
843c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      Data.VBases[i] = Reader.ReadCXXBaseSpecifier(F, Record, Idx);
8440f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis
8450f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Reader.ReadUnresolvedSet(Data.Conversions, Record, Idx);
8460f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Reader.ReadUnresolvedSet(Data.VisibleConversions, Record, Idx);
8470f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    assert(Data.Definition && "Data.Definition should be already set!");
8480f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.FirstFriend
8490f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis        = cast_or_null<FriendDecl>(Reader.GetDecl(Record[Idx++]));
85037ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis  }
85137ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis
8528731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  enum CXXRecKind {
8538731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    CXXRecNotTemplate = 0, CXXRecTemplate, CXXRecMemberSpecialization
8548731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  };
8558731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  switch ((CXXRecKind)Record[Idx++]) {
8568731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  default:
857d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl    assert(false && "Out of sync with ASTDeclWriter::VisitCXXRecordDecl?");
8588731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  case CXXRecNotTemplate:
8598731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    break;
8608731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  case CXXRecTemplate:
8618b996b8cb4b4711b260b0cf21ba388d3909af10dArgyrios Kyrtzidis    D->TemplateOrInstantiation
8628b996b8cb4b4711b260b0cf21ba388d3909af10dArgyrios Kyrtzidis        = cast<ClassTemplateDecl>(Reader.GetDecl(Record[Idx++]));
8638731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    break;
8648731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  case CXXRecMemberSpecialization: {
8658731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    CXXRecordDecl *RD = cast<CXXRecordDecl>(Reader.GetDecl(Record[Idx++]));
8668731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++];
867c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SourceLocation POI = ReadSourceLocation(Record, Idx);
8688b996b8cb4b4711b260b0cf21ba388d3909af10dArgyrios Kyrtzidis    MemberSpecializationInfo *MSI = new (C) MemberSpecializationInfo(RD, TSK);
8698b996b8cb4b4711b260b0cf21ba388d3909af10dArgyrios Kyrtzidis    MSI->setPointOfInstantiation(POI);
8708b996b8cb4b4711b260b0cf21ba388d3909af10dArgyrios Kyrtzidis    D->TemplateOrInstantiation = MSI;
8718731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    break;
8728731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  }
8738731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  }
87436d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis
87536d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis  // Load the key function to avoid deserializing every method so we can
87636d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis  // compute it.
87736d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis  if (D->IsDefinition) {
87836d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis    CXXMethodDecl *Key
87936d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis        = cast_or_null<CXXMethodDecl>(Reader.GetDecl(Record[Idx++]));
88036d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis    if (Key)
88136d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis      C.KeyFunctions[D] = Key;
88236d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis  }
8836ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
8846ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
885d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitCXXMethodDecl(CXXMethodDecl *D) {
8866ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitFunctionDecl(D);
887c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  unsigned NumOverridenMethods = Record[Idx++];
888c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  while (NumOverridenMethods--) {
889c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis    CXXMethodDecl *MD = cast<CXXMethodDecl>(Reader.GetDecl(Record[Idx++]));
890c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis    // Avoid invariant checking of CXXMethodDecl::addOverriddenMethod,
891c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis    // MD may be initializing.
892c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis    Reader.getContext()->addOverriddenMethod(D, MD);
893c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  }
8946ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
8956ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
896d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitCXXConstructorDecl(CXXConstructorDecl *D) {
8976ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitCXXMethodDecl(D);
89891468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis
89991468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis  D->IsExplicitSpecified = Record[Idx++];
90091468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis  D->ImplicitlyDefined = Record[Idx++];
9018e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis  llvm::tie(D->BaseOrMemberInitializers, D->NumBaseOrMemberInitializers)
902c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      = Reader.ReadCXXBaseOrMemberInitializers(F, Record, Idx);
9036ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
9046ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
905d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitCXXDestructorDecl(CXXDestructorDecl *D) {
9066ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitCXXMethodDecl(D);
90791468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis
90891468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis  D->ImplicitlyDefined = Record[Idx++];
90991468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis  D->OperatorDelete = cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++]));
9106ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
9116ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
912d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitCXXConversionDecl(CXXConversionDecl *D) {
9136ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitCXXMethodDecl(D);
91491468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis  D->IsExplicitSpecified = Record[Idx++];
9156ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
9166ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
917d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitAccessSpecDecl(AccessSpecDecl *D) {
9186206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara  VisitDecl(D);
919c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setColonLoc(ReadSourceLocation(Record, Idx));
9206206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara}
9216206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara
922d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFriendDecl(FriendDecl *D) {
923c8f9af2943699ff623ca08f2e5ed4d72e0351189Argyrios Kyrtzidis  VisitDecl(D);
9246764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis  if (Record[Idx++])
925c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    D->Friend = GetTypeSourceInfo(Record, Idx);
9266764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis  else
9276764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis    D->Friend = cast<NamedDecl>(Reader.GetDecl(Record[Idx++]));
9286764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis  D->NextFriend = cast_or_null<FriendDecl>(Reader.GetDecl(Record[Idx++]));
9296102ca1d490836096678d7d934f0b2b78f9293ecJohn McCall  D->UnsupportedFriend = (Record[Idx++] != 0);
930c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->FriendLoc = ReadSourceLocation(Record, Idx);
9316764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis}
9326764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis
933d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFriendTemplateDecl(FriendTemplateDecl *D) {
934554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis  VisitDecl(D);
935554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis  unsigned NumParams = Record[Idx++];
936554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis  D->NumParams = NumParams;
937554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis  D->Params = new TemplateParameterList*[NumParams];
938554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis  for (unsigned i = 0; i != NumParams; ++i)
939c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    D->Params[i] = Reader.ReadTemplateParameterList(F, Record, Idx);
940554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis  if (Record[Idx++]) // HasFriendDecl
941554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis    D->Friend = cast<NamedDecl>(Reader.GetDecl(Record[Idx++]));
942554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis  else
943c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    D->Friend = GetTypeSourceInfo(Record, Idx);
944c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->FriendLoc = ReadSourceLocation(Record, Idx);
9456ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
9466ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
947d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTemplateDecl(TemplateDecl *D) {
9488731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  VisitNamedDecl(D);
9498731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis
950bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis  NamedDecl *TemplatedDecl
951bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis    = cast_or_null<NamedDecl>(Reader.GetDecl(Record[Idx++]));
952dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  TemplateParameterList* TemplateParams
953c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      = Reader.ReadTemplateParameterList(F, Record, Idx);
9548731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  D->init(TemplatedDecl, TemplateParams);
9556ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
9566ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
957d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D) {
9586b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  // Initialize CommonOrPrev before VisitTemplateDecl so that getCommonPtr()
9596b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  // can be used while this is still initializing.
9608731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis
9616b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  assert(D->CommonOrPrev.isNull() && "getCommonPtr was called earlier on this");
9629eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  RedeclarableTemplateDecl *PrevDecl =
9639eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne      cast_or_null<RedeclarableTemplateDecl>(Reader.GetDecl(Record[Idx++]));
9649eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  assert((PrevDecl == 0 || PrevDecl->getKind() == D->getKind()) &&
9659eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne         "PrevDecl kind mismatch");
9669eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  if (PrevDecl)
9679eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne    D->CommonOrPrev = PrevDecl;
9688731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  if (PrevDecl == 0) {
9696b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis    D->CommonOrPrev = D->newCommon(*Reader.getContext());
9709eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne    if (RedeclarableTemplateDecl *RTD
9719eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne          = cast_or_null<RedeclarableTemplateDecl>(Reader.GetDecl(Record[Idx++]))) {
9729eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne      assert(RTD->getKind() == D->getKind() &&
9739eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne             "InstantiatedFromMemberTemplate kind mismatch");
9749eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne      D->setInstantiatedFromMemberTemplateImpl(RTD);
9759eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne      if (Record[Idx++])
9769eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne        D->setMemberSpecialization();
9779eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne    }
9788a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne
9798a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne    RedeclarableTemplateDecl *LatestDecl =
9808a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne        cast_or_null<RedeclarableTemplateDecl>(Reader.GetDecl(Record[Idx++]));
981a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis
982a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    // This decl is a first one and the latest declaration that it points to is
9833c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl    // in the same AST file. However, if this actually needs to point to a
9843c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl    // redeclaration in another AST file, we need to update it by checking
985a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    // the FirstLatestDeclIDs map which tracks this kind of decls.
986a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    assert(Reader.GetDecl(ThisDeclID) == D && "Invalid ThisDeclID ?");
987c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl    ASTReader::FirstLatestDeclIDMap::iterator I
988a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis        = Reader.FirstLatestDeclIDs.find(ThisDeclID);
989a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    if (I != Reader.FirstLatestDeclIDs.end()) {
990a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis      Decl *NewLatest = Reader.GetDecl(I->second);
991a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis      assert((LatestDecl->getLocation().isInvalid() ||
992a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis              NewLatest->getLocation().isInvalid()  ||
993a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis              Reader.SourceMgr.isBeforeInTranslationUnit(
994a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis                                                   LatestDecl->getLocation(),
995a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis                                                   NewLatest->getLocation())) &&
996a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis             "The new latest is supposed to come after the previous latest");
997a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis      LatestDecl = cast<RedeclarableTemplateDecl>(NewLatest);
998a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    }
999a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis
10008a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne    assert(LatestDecl->getKind() == D->getKind() && "Latest kind mismatch");
10018a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne    D->getCommonPtr()->Latest = LatestDecl;
10029eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  }
10036b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis
10046b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  VisitTemplateDecl(D);
10056b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  D->IdentifierNamespace = Record[Idx++];
10069eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne}
10079eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
1008d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitClassTemplateDecl(ClassTemplateDecl *D) {
10099eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  VisitRedeclarableTemplateDecl(D);
10109eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
10119eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  if (D->getPreviousDeclaration() == 0) {
10128731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    // This ClassTemplateDecl owns a CommonPtr; read it.
10138731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis
1014ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis    // FoldingSets are filled in VisitClassTemplateSpecializationDecl.
10158731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    unsigned size = Record[Idx++];
1016ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis    while (size--)
1017ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis      cast<ClassTemplateSpecializationDecl>(Reader.GetDecl(Record[Idx++]));
10188731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis
10198731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    size = Record[Idx++];
1020ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis    while (size--)
1021ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis      cast<ClassTemplatePartialSpecializationDecl>(
10228731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                                 Reader.GetDecl(Record[Idx++]));
10238731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis
10248731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    // InjectedClassNameType is computed.
10258731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  }
10266ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
10276ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
1028d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitClassTemplateSpecializationDecl(
10296ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                           ClassTemplateSpecializationDecl *D) {
1030dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  VisitCXXRecordDecl(D);
1031586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis
1032586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis  ASTContext &C = *Reader.getContext();
1033dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  if (Decl *InstD = Reader.GetDecl(Record[Idx++])) {
1034dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis    if (ClassTemplateDecl *CTD = dyn_cast<ClassTemplateDecl>(InstD)) {
1035586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis      D->SpecializedTemplate = CTD;
1036dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis    } else {
1037dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis      llvm::SmallVector<TemplateArgument, 8> TemplArgs;
1038c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      Reader.ReadTemplateArgumentList(TemplArgs, F, Record, Idx);
1039586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis      TemplateArgumentList *ArgList
1040586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis          = new (C) TemplateArgumentList(C, TemplArgs.data(), TemplArgs.size());
1041586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis      ClassTemplateSpecializationDecl::SpecializedPartialSpecialization *PS
1042586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis          = new (C) ClassTemplateSpecializationDecl::
1043586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis                                             SpecializedPartialSpecialization();
1044586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis      PS->PartialSpecialization
1045586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis          = cast<ClassTemplatePartialSpecializationDecl>(InstD);
1046586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis      PS->TemplateArgs = ArgList;
1047586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis      D->SpecializedTemplate = PS;
1048dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis    }
1049dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  }
1050dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis
1051dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  // Explicit info.
1052c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  if (TypeSourceInfo *TyInfo = GetTypeSourceInfo(Record, Idx)) {
1053586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis    ClassTemplateSpecializationDecl::ExplicitSpecializationInfo *ExplicitInfo
1054586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis        = new (C) ClassTemplateSpecializationDecl::ExplicitSpecializationInfo;
1055586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis    ExplicitInfo->TypeAsWritten = TyInfo;
1056c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    ExplicitInfo->ExternLoc = ReadSourceLocation(Record, Idx);
1057c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    ExplicitInfo->TemplateKeywordLoc = ReadSourceLocation(Record, Idx);
1058586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis    D->ExplicitInfo = ExplicitInfo;
1059dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  }
1060dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis
1061dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  llvm::SmallVector<TemplateArgument, 8> TemplArgs;
1062c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  Reader.ReadTemplateArgumentList(TemplArgs, F, Record, Idx);
1063586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis  D->TemplateArgs.init(C, TemplArgs.data(), TemplArgs.size());
1064c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->PointOfInstantiation = ReadSourceLocation(Record, Idx);
1065586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis  D->SpecializationKind = (TemplateSpecializationKind)Record[Idx++];
1066ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis
1067bc5ab7c9e307fea5ecb979b30815da7a370e1c05Argyrios Kyrtzidis  if (D->isCanonicalDecl()) { // It's kept in the folding set.
1068ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis    ClassTemplateDecl *CanonPattern
1069ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis                       = cast<ClassTemplateDecl>(Reader.GetDecl(Record[Idx++]));
1070ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis    if (ClassTemplatePartialSpecializationDecl *Partial
1071ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis            = dyn_cast<ClassTemplatePartialSpecializationDecl>(D)) {
10720a67eddc8fa2d6d1319deff0d52850f079753b2aArgyrios Kyrtzidis      CanonPattern->getPartialSpecializations().InsertNode(Partial);
1073ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis    } else {
10740a67eddc8fa2d6d1319deff0d52850f079753b2aArgyrios Kyrtzidis      CanonPattern->getSpecializations().InsertNode(D);
1075ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis    }
1076ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis  }
10776ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
10786ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
1079d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitClassTemplatePartialSpecializationDecl(
10806ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                    ClassTemplatePartialSpecializationDecl *D) {
1081dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  VisitClassTemplateSpecializationDecl(D);
1082dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis
10838fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis  ASTContext &C = *Reader.getContext();
1084c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->TemplateParams = Reader.ReadTemplateParameterList(F, Record, Idx);
10858fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis
1086dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  unsigned NumArgs = Record[Idx++];
10878fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis  if (NumArgs) {
10888fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis    D->NumArgsAsWritten = NumArgs;
10898fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis    D->ArgsAsWritten = new (C) TemplateArgumentLoc[NumArgs];
10908fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis    for (unsigned i=0; i != NumArgs; ++i)
1091c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      D->ArgsAsWritten[i] = Reader.ReadTemplateArgumentLoc(F, Record, Idx);
10928fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis  }
10938fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis
10948fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis  D->SequenceNumber = Record[Idx++];
1095dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis
1096dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  // These are read/set from/to the first declaration.
1097dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  if (D->getPreviousDeclaration() == 0) {
10988fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis    D->InstantiatedFromMember.setPointer(
1099dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis        cast_or_null<ClassTemplatePartialSpecializationDecl>(
1100dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis                                                Reader.GetDecl(Record[Idx++])));
11018fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis    D->InstantiatedFromMember.setInt(Record[Idx++]);
1102dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  }
11036ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
11046ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
1105d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {
11069eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  VisitRedeclarableTemplateDecl(D);
1107f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis
11089eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  if (D->getPreviousDeclaration() == 0) {
1109f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    // This FunctionTemplateDecl owns a CommonPtr; read it.
1110f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis
1111057d9afdc7e8027f3b928f0dd8d7d921d7cd5615Argyrios Kyrtzidis    // Read the function specialization declarations.
1112057d9afdc7e8027f3b928f0dd8d7d921d7cd5615Argyrios Kyrtzidis    // FunctionTemplateDecl's FunctionTemplateSpecializationInfos are filled
111399a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis    // when reading the specialized FunctionDecl.
1114057d9afdc7e8027f3b928f0dd8d7d921d7cd5615Argyrios Kyrtzidis    unsigned NumSpecs = Record[Idx++];
1115057d9afdc7e8027f3b928f0dd8d7d921d7cd5615Argyrios Kyrtzidis    while (NumSpecs--)
1116057d9afdc7e8027f3b928f0dd8d7d921d7cd5615Argyrios Kyrtzidis      Reader.GetDecl(Record[Idx++]);
1117f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  }
11186ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
11196ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
1120d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
11218731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  VisitTypeDecl(D);
11228731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis
11238731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  D->setDeclaredWithTypename(Record[Idx++]);
11248731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  D->setParameterPack(Record[Idx++]);
11258731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis
11268731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  bool Inherited = Record[Idx++];
1127c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TypeSourceInfo *DefArg = GetTypeSourceInfo(Record, Idx);
11288731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  D->setDefaultArgument(DefArg, Inherited);
11296ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
11306ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
1131d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
1132b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis  VisitVarDecl(D);
1133b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis  // TemplateParmPosition.
1134b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis  D->setDepth(Record[Idx++]);
1135b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis  D->setPosition(Record[Idx++]);
1136b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis  // Rest of NonTypeTemplateParmDecl.
1137b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis  if (Record[Idx++]) {
1138c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    Expr *DefArg = Reader.ReadExpr(F);
1139b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis    bool Inherited = Record[Idx++];
1140b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis    D->setDefaultArgument(DefArg, Inherited);
1141b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis }
11426ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
11436ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
1144d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
1145bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis  VisitTemplateDecl(D);
1146bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis  // TemplateParmPosition.
1147bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis  D->setDepth(Record[Idx++]);
1148bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis  D->setPosition(Record[Idx++]);
1149bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis  // Rest of TemplateTemplateParmDecl.
1150c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TemplateArgumentLoc Arg = Reader.ReadTemplateArgumentLoc(F, Record, Idx);
1151bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis  bool IsInherited = Record[Idx++];
1152bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis  D->setDefaultArgument(Arg, IsInherited);
11536ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
11546ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
1155d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitStaticAssertDecl(StaticAssertDecl *D) {
11560d396896998685809bda7444d772bbeb5bbe9b46Argyrios Kyrtzidis  VisitDecl(D);
1157c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->AssertExpr = Reader.ReadExpr(F);
1158c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->Message = cast<StringLiteral>(Reader.ReadExpr(F));
11596ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
11606ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
11611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstd::pair<uint64_t, uint64_t>
1162d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian RedlASTDeclReader::VisitDeclContext(DeclContext *DC) {
1163698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  uint64_t LexicalOffset = Record[Idx++];
1164698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  uint64_t VisibleOffset = Record[Idx++];
1165698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  return std::make_pair(LexicalOffset, VisibleOffset);
1166698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
1167698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1168a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidistemplate <typename T>
1169d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitRedeclarable(Redeclarable<T> *D) {
1170a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  enum RedeclKind { NoRedeclaration = 0, PointsToPrevious, PointsToLatest };
1171a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  RedeclKind Kind = (RedeclKind)Record[Idx++];
1172a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  switch (Kind) {
1173a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  default:
1174d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl    assert(0 && "Out of sync with ASTDeclWriter::VisitRedeclarable or messed up"
1175a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis                " reading");
1176a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  case NoRedeclaration:
1177a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    break;
1178a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  case PointsToPrevious:
1179a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    D->RedeclLink = typename Redeclarable<T>::PreviousDeclLink(
1180a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis                                cast_or_null<T>(Reader.GetDecl(Record[Idx++])));
1181a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    break;
1182a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  case PointsToLatest:
1183a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    D->RedeclLink = typename Redeclarable<T>::LatestDeclLink(
1184a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis                                cast_or_null<T>(Reader.GetDecl(Record[Idx++])));
1185a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    break;
1186a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  }
1187a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis
1188a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  assert(!(Kind == PointsToPrevious &&
1189a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis           Reader.FirstLatestDeclIDs.find(ThisDeclID) !=
1190a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis               Reader.FirstLatestDeclIDs.end()) &&
1191a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis         "This decl is not first, it should not be in the map");
1192a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  if (Kind == PointsToPrevious)
1193a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    return;
1194a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis
1195a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  // This decl is a first one and the latest declaration that it points to is in
11963c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl  // the same AST file. However, if this actually needs to point to a
11973c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl  // redeclaration in another AST file, we need to update it by checking the
1198a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  // FirstLatestDeclIDs map which tracks this kind of decls.
1199a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  assert(Reader.GetDecl(ThisDeclID) == static_cast<T*>(D) &&
1200a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis         "Invalid ThisDeclID ?");
1201c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl  ASTReader::FirstLatestDeclIDMap::iterator I
1202a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis      = Reader.FirstLatestDeclIDs.find(ThisDeclID);
1203a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  if (I != Reader.FirstLatestDeclIDs.end()) {
1204a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    Decl *NewLatest = Reader.GetDecl(I->second);
1205a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    assert((D->getMostRecentDeclaration()->getLocation().isInvalid() ||
1206a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis            NewLatest->getLocation().isInvalid() ||
1207a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis            Reader.SourceMgr.isBeforeInTranslationUnit(
1208a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis                                   D->getMostRecentDeclaration()->getLocation(),
1209a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis                                   NewLatest->getLocation())) &&
1210a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis           "The new latest is supposed to come after the previous latest");
1211a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    D->RedeclLink
1212a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis        = typename Redeclarable<T>::LatestDeclLink(cast_or_null<T>(NewLatest));
1213a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  }
1214a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis}
1215a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis
1216698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner//===----------------------------------------------------------------------===//
12174e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner// Attribute Reading
1218698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner//===----------------------------------------------------------------------===//
1219698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
12204e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner/// \brief Reads attributes from the current stream position.
12214eb9fc0449ddbd5239ddc3ae6b6e52880f47dcf7Argyrios Kyrtzidisvoid ASTReader::ReadAttributes(PerFileData &F, AttrVec &Attrs,
12224eb9fc0449ddbd5239ddc3ae6b6e52880f47dcf7Argyrios Kyrtzidis                               const RecordData &Record, unsigned &Idx) {
12234eb9fc0449ddbd5239ddc3ae6b6e52880f47dcf7Argyrios Kyrtzidis  for (unsigned i = 0, e = Record[Idx++]; i != e; ++i) {
12244e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner    Attr *New = 0;
1225387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt    attr::Kind Kind = (attr::Kind)Record[Idx++];
1226c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SourceLocation Loc = ReadSourceLocation(F, Record, Idx);
1227cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt    bool isInherited = Record[Idx++];
12284e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner
1229cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt#include "clang/Serialization/AttrPCHRead.inc"
12304e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner
12314e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner    assert(New && "Unable to decode attribute?");
1232cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt    New->setInherited(isInherited);
1233cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt    Attrs.push_back(New);
12344e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner  }
12354e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner}
12364e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner
12374e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner//===----------------------------------------------------------------------===//
1238c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl// ASTReader Implementation
12394e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner//===----------------------------------------------------------------------===//
1240698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1241698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// \brief Note that we have loaded the declaration with the given
1242698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// Index.
12431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump///
1244698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// This routine notes that this declaration has already been loaded,
1245698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// so that future GetDecl calls will return this declaration rather
1246698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// than trying to load a new declaration.
1247c43b54cbc10654ed59de797898042e1a05265246Sebastian Redlinline void ASTReader::LoadedDecl(unsigned Index, Decl *D) {
1248698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  assert(!DeclsLoaded[Index] && "Decl loaded twice?");
1249698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  DeclsLoaded[Index] = D;
1250698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
1251698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1252698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1253698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// \brief Determine whether the consumer will be interested in seeing
1254698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// this declaration (via HandleTopLevelDecl).
1255698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner///
1256698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// This routine should return true for anything that might affect
1257698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// code generation, e.g., inline function definitions, Objective-C
1258698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// declarations with metadata, etc.
1259698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattnerstatic bool isConsumerInterestedIn(Decl *D) {
126004a0b50e19a5598330a4b42c5de2583e244df22fDaniel Dunbar  if (isa<FileScopeAsmDecl>(D))
126104a0b50e19a5598330a4b42c5de2583e244df22fDaniel Dunbar    return true;
1262698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  if (VarDecl *Var = dyn_cast<VarDecl>(D))
12633f95477f28ef3baaf79001a5654785c8b2075710Argyrios Kyrtzidis    return Var->isFileVarDecl() &&
12643f95477f28ef3baaf79001a5654785c8b2075710Argyrios Kyrtzidis           Var->isThisDeclarationADefinition() == VarDecl::Definition;
1265698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  if (FunctionDecl *Func = dyn_cast<FunctionDecl>(D))
1266698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    return Func->isThisDeclarationADefinition();
12679d50c0635fb213b2a1857e3f8488580f0dab2f98Argyrios Kyrtzidis  return isa<ObjCProtocolDecl>(D) || isa<ObjCImplementationDecl>(D);
1268698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
1269698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1270cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl/// \brief Get the correct cursor and offset for loading a type.
1271c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlASTReader::RecordLocation
12728538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlASTReader::DeclCursorForIndex(unsigned Index, DeclID ID) {
12730b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl  // See if there's an override.
12740b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl  DeclReplacementMap::iterator It = ReplacedDecls.find(ID);
12750b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl  if (It != ReplacedDecls.end())
1276c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    return RecordLocation(It->second.first, It->second.second);
12770b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl
1278cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl  PerFileData *F = 0;
1279cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl  for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
1280cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl    F = Chain[N - I - 1];
1281cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl    if (Index < F->LocalNumDecls)
1282cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl      break;
1283cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl    Index -= F->LocalNumDecls;
1284cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl  }
1285cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl  assert(F && F->LocalNumDecls > Index && "Broken chain");
1286c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  return RecordLocation(F, F->DeclOffsets[Index]);
1287cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl}
1288cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl
1289d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl/// \brief Read the declaration at the given offset from the AST file.
12908538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlDecl *ASTReader::ReadDeclRecord(unsigned Index, DeclID ID) {
12910b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl  RecordLocation Loc = DeclCursorForIndex(Index, ID);
1292c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  llvm::BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
1293698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  // Keep track of where we are in the stream, then jump back there
1294698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  // after reading this declaration.
1295da93061f56d5820725b01a140879d047554e7d32Chris Lattner  SavedStreamPosition SavedPosition(DeclsCursor);
1296698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1297919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  ReadingKindTracker ReadingKind(Read_Decl, *this);
1298919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
1299d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor  // Note that we are loading a declaration record.
130029ee3a273f58e16df7f2c524ab62a869e44fc9b1Argyrios Kyrtzidis  Deserializing ADecl(this);
13011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1302c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  DeclsCursor.JumpToBit(Loc.Offset);
1303698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  RecordData Record;
1304da93061f56d5820725b01a140879d047554e7d32Chris Lattner  unsigned Code = DeclsCursor.ReadCode();
1305698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned Idx = 0;
1306c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  ASTDeclReader Reader(*this, *Loc.F, DeclsCursor, ID, Record, Idx);
1307698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1308da93061f56d5820725b01a140879d047554e7d32Chris Lattner  Decl *D = 0;
13098538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  switch ((DeclCode)DeclsCursor.ReadRecord(Code, Record)) {
13108538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CONTEXT_LEXICAL:
13118538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CONTEXT_VISIBLE:
1312698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    assert(false && "Record cannot be de-serialized with ReadDeclRecord");
1313698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
13148538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_TRANSLATION_UNIT:
1315698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    assert(Index == 0 && "Translation unit must be at index 0");
1316d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = Context->getTranslationUnitDecl();
1317698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
13188538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_TYPEDEF:
1319ba6a9bd384df475780be636ca45bcef5c5bbd19fJohn McCall    D = TypedefDecl::Create(*Context, 0, SourceLocation(), 0, 0);
1320698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
13218538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_ENUM:
1322b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis    D = EnumDecl::Create(*Context, Decl::EmptyShell());
1323698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
13248538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_RECORD:
1325b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis    D = RecordDecl::Create(*Context, Decl::EmptyShell());
1326698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
13278538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_ENUM_CONSTANT:
1328d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = EnumConstantDecl::Create(*Context, 0, SourceLocation(), 0, QualType(),
1329698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                                 0, llvm::APSInt());
1330698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
13318538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_FUNCTION:
13321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    D = FunctionDecl::Create(*Context, 0, SourceLocation(), DeclarationName(),
1333a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis                             QualType(), 0);
1334698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
13358538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_LINKAGE_SPEC:
13366ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = LinkageSpecDecl::Create(*Context, 0, SourceLocation(),
13376ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                (LinkageSpecDecl::LanguageIDs)0,
13386ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                false);
13396ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13408538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_NAMESPACE:
13416ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = NamespaceDecl::Create(*Context, 0, SourceLocation(), 0);
13426ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13438538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_NAMESPACE_ALIAS:
13446ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = NamespaceAliasDecl::Create(*Context, 0, SourceLocation(),
13456ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                   SourceLocation(), 0, SourceRange(), 0,
13466ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                   SourceLocation(), 0);
13476ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13488538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_USING:
1349ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara    D = UsingDecl::Create(*Context, 0, SourceRange(), SourceLocation(),
1350ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara                          0, DeclarationNameInfo(), false);
13516ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13528538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_USING_SHADOW:
13536ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = UsingShadowDecl::Create(*Context, 0, SourceLocation(), 0, 0);
13546ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13558538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_USING_DIRECTIVE:
13566ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = UsingDirectiveDecl::Create(*Context, 0, SourceLocation(),
13576ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                   SourceLocation(), SourceRange(), 0,
13586ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                   SourceLocation(), 0, 0);
13596ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13608538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_UNRESOLVED_USING_VALUE:
13616ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = UnresolvedUsingValueDecl::Create(*Context, 0, SourceLocation(),
1362ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara                                         SourceRange(), 0,
1363ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara                                         DeclarationNameInfo());
13646ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13658538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_UNRESOLVED_USING_TYPENAME:
13666ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = UnresolvedUsingTypenameDecl::Create(*Context, 0, SourceLocation(),
13676ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                            SourceLocation(), SourceRange(),
13686ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                            0, SourceLocation(),
13696ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                            DeclarationName());
13706ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13718538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CXX_RECORD:
1372b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis    D = CXXRecordDecl::Create(*Context, Decl::EmptyShell());
13736ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13748538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CXX_METHOD:
13752577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    D = CXXMethodDecl::Create(*Context, 0, DeclarationNameInfo(),
13766ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                              QualType(), 0);
13776ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13788538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CXX_CONSTRUCTOR:
13796ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = CXXConstructorDecl::Create(*Context, Decl::EmptyShell());
13806ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13818538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CXX_DESTRUCTOR:
13826ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = CXXDestructorDecl::Create(*Context, Decl::EmptyShell());
13836ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13848538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CXX_CONVERSION:
13856ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = CXXConversionDecl::Create(*Context, Decl::EmptyShell());
13866ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13878538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_ACCESS_SPEC:
138865b63ec1410f09e1f3cdb847018d678b8f8fc3f7Argyrios Kyrtzidis    D = AccessSpecDecl::Create(*Context, Decl::EmptyShell());
13896206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara    break;
13908538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_FRIEND:
13916764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis    D = FriendDecl::Create(*Context, Decl::EmptyShell());
13926ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13938538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_FRIEND_TEMPLATE:
1394554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis    D = FriendTemplateDecl::Create(*Context, Decl::EmptyShell());
13956ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13968538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CLASS_TEMPLATE:
13975bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis    D = ClassTemplateDecl::Create(*Context, 0, SourceLocation(),
13985bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis                                  DeclarationName(), 0, 0, 0);
13996ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
14008538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CLASS_TEMPLATE_SPECIALIZATION:
1401b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis    D = ClassTemplateSpecializationDecl::Create(*Context, Decl::EmptyShell());
14026ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
14038538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION:
1404b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis    D = ClassTemplatePartialSpecializationDecl::Create(*Context,
1405b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis                                                            Decl::EmptyShell());
14066ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
14078538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_FUNCTION_TEMPLATE:
1408f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    D = FunctionTemplateDecl::Create(*Context, 0, SourceLocation(),
1409f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis                                     DeclarationName(), 0, 0);
14106ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
14118538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_TEMPLATE_TYPE_PARM:
1412b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis    D = TemplateTypeParmDecl::Create(*Context, Decl::EmptyShell());
14136ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
14148538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_NON_TYPE_TEMPLATE_PARM:
1415b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis    D = NonTypeTemplateParmDecl::Create(*Context, 0, SourceLocation(), 0,0,0,
1416b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis                                        QualType(),0);
14176ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
14188538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_TEMPLATE_TEMPLATE_PARM:
1419bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis    D = TemplateTemplateParmDecl::Create(*Context, 0, SourceLocation(),0,0,0,0);
14206ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
14218538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_STATIC_ASSERT:
14220d396896998685809bda7444d772bbeb5bbe9b46Argyrios Kyrtzidis    D = StaticAssertDecl::Create(*Context, 0, SourceLocation(), 0, 0);
14236ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
14246ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
14258538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_METHOD:
14261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    D = ObjCMethodDecl::Create(*Context, SourceLocation(), SourceLocation(),
14274bc1cb6aa635a5bf8fae99bf69c56c724c1e786cDouglas Gregor                               Selector(), QualType(), 0, 0);
1428698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14298538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_INTERFACE:
1430deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor    D = ObjCInterfaceDecl::Create(*Context, 0, SourceLocation(), 0);
1431698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14328538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_IVAR:
1433a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis    D = ObjCIvarDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 0,
1434698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                             ObjCIvarDecl::None);
1435698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14368538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_PROTOCOL:
1437d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = ObjCProtocolDecl::Create(*Context, 0, SourceLocation(), 0);
1438698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14398538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_AT_DEFS_FIELD:
14401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    D = ObjCAtDefsFieldDecl::Create(*Context, 0, SourceLocation(), 0,
1441698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                                    QualType(), 0);
1442698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14438538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_CLASS:
1444d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = ObjCClassDecl::Create(*Context, 0, SourceLocation());
1445698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14468538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_FORWARD_PROTOCOL:
1447d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = ObjCForwardProtocolDecl::Create(*Context, 0, SourceLocation());
1448698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14498538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_CATEGORY:
14503db211b617c5073aa70eb25d37ed44ae0dca17c4Douglas Gregor    D = ObjCCategoryDecl::Create(*Context, 0, SourceLocation(),
14513db211b617c5073aa70eb25d37ed44ae0dca17c4Douglas Gregor                                 SourceLocation(), SourceLocation(), 0);
1452698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14538538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_CATEGORY_IMPL:
1454d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = ObjCCategoryImplDecl::Create(*Context, 0, SourceLocation(), 0, 0);
1455698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14568538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_IMPLEMENTATION:
1457d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = ObjCImplementationDecl::Create(*Context, 0, SourceLocation(), 0, 0);
1458698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14598538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_COMPATIBLE_ALIAS:
1460d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = ObjCCompatibleAliasDecl::Create(*Context, 0, SourceLocation(), 0, 0);
1461698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14628538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_PROPERTY:
1463d0502407c1b41b2ace326f355d7b7a6876246223Fariborz Jahanian    D = ObjCPropertyDecl::Create(*Context, 0, SourceLocation(), 0, SourceLocation(),
146483a230c83a54190366138c1a4f4310ef838b88fcJohn McCall                                 0);
1465698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14668538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_PROPERTY_IMPL:
1467d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = ObjCPropertyImplDecl::Create(*Context, 0, SourceLocation(),
14681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     SourceLocation(), 0,
1469698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                                     ObjCPropertyImplDecl::Dynamic, 0);
1470698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14718538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_FIELD:
14721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    D = FieldDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 0, 0,
1473a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis                          false);
1474698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14758538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_VAR:
1476a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis    D = VarDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 0,
1477d931b086984257de68868a64a235c2b4b34003fbJohn McCall                        SC_None, SC_None);
1478698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
1479698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
14808538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_IMPLICIT_PARAM:
1481d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = ImplicitParamDecl::Create(*Context, 0, SourceLocation(), 0, QualType());
1482698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
1483698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
14848538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_PARM_VAR:
14851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    D = ParmVarDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 0,
1486d931b086984257de68868a64a235c2b4b34003fbJohn McCall                            SC_None, SC_None, 0);
1487698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14888538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_FILE_SCOPE_ASM:
1489d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = FileScopeAsmDecl::Create(*Context, 0, SourceLocation(), 0);
1490698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14918538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_BLOCK:
1492d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = BlockDecl::Create(*Context, 0, SourceLocation());
1493698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
1494698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  }
1495698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1496d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl  assert(D && "Unknown declaration reading AST file");
14974e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner  LoadedDecl(Index, D);
14984e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner  Reader.Visit(D);
1499698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1500698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  // If this declaration is also a declaration context, get the
1501698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  // offsets for its tables of lexical and visible declarations.
1502698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  if (DeclContext *DC = dyn_cast<DeclContext>(D)) {
1503698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    std::pair<uint64_t, uint64_t> Offsets = Reader.VisitDeclContext(DC);
1504698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    if (Offsets.first || Offsets.second) {
1505698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner      DC->setHasExternalLexicalStorage(Offsets.first != 0);
1506698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner      DC->setHasExternalVisibleStorage(Offsets.second != 0);
1507681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl      DeclContextInfo Info;
1508681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl      if (ReadDeclContextStorage(DeclsCursor, Offsets, Info))
1509681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl        return 0;
1510d692af71226d2fb537d86c670af96114ddd485c3Sebastian Redl      DeclContextInfos &Infos = DeclContextOffsets[DC];
1511e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl      // Reading the TU will happen after reading its lexical update blocks,
1512e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl      // so we need to make sure we insert in front. For all other contexts,
1513e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl      // the vector is empty here anyway, so there's no loss in efficiency.
1514d692af71226d2fb537d86c670af96114ddd485c3Sebastian Redl      Infos.insert(Infos.begin(), Info);
1515e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl
1516e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl      // Now add the pending visible updates for this decl context, if it has
1517e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl      // any.
1518e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl      DeclContextVisibleUpdatesPending::iterator I =
1519e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl          PendingVisibleUpdates.find(ID);
1520e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl      if (I != PendingVisibleUpdates.end()) {
1521e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl        DeclContextVisibleUpdates &U = I->second;
1522e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl        Info.LexicalDecls = 0;
1523e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl        Info.NumLexicalDecls = 0;
1524e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl        for (DeclContextVisibleUpdates::iterator UI = U.begin(), UE = U.end();
1525e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl             UI != UE; ++UI) {
1526e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl          Info.NameLookupTableData = *UI;
1527e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl          Infos.push_back(Info);
1528e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl        }
1529e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl        PendingVisibleUpdates.erase(I);
1530e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl      }
1531698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    }
1532698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  }
15336e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl
15346e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl  // If this is a template, read additional specializations that may be in a
15356e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl  // different part of the chain.
15366e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl  if (isa<RedeclarableTemplateDecl>(D)) {
15376e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl    AdditionalTemplateSpecializationsMap::iterator F =
15386e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl        AdditionalTemplateSpecializationsPending.find(ID);
15396e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl    if (F != AdditionalTemplateSpecializationsPending.end()) {
15406e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl      for (AdditionalTemplateSpecializations::iterator I = F->second.begin(),
15416e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl                                                       E = F->second.end();
15426e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl           I != E; ++I)
15436e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl        GetDecl(*I);
15446e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl      AdditionalTemplateSpecializationsPending.erase(F);
15456e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl    }
15466e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl  }
1547698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  assert(Idx == Record.size());
1548698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1549698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  // If we have deserialized a declaration that has a definition the
1550bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis  // AST consumer might need to know about, queue it.
1551bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis  // We don't pass it to the consumer immediately because we may be in recursive
1552bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis  // loading, and some declarations may still be initializing.
1553bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis  if (isConsumerInterestedIn(D))
1554bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis    InterestingDecls.push_back(D);
1555698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1556698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  return D;
1557698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
1558