ASTReaderDecl.cpp revision c3632730cc83ed7b51f0ab5c38997ae5a9439b0c
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    }
52577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl
53698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  public:
54c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    ASTDeclReader(ASTReader &Reader, ASTReader::PerFileData &F,
55c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl                  llvm::BitstreamCursor &Cursor, DeclID thisDeclID,
56c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl                  const ASTReader::RecordData &Record, unsigned &Idx)
57c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      : Reader(Reader), F(F), Cursor(Cursor), ThisDeclID(thisDeclID),
58c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        Record(Record), Idx(Idx), TypeIDForTypeDecl(0) { }
59698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
60d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis    void Visit(Decl *D);
61d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis
62698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitDecl(Decl *D);
63698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitTranslationUnitDecl(TranslationUnitDecl *TU);
64698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitNamedDecl(NamedDecl *ND);
650cef483f3b9d6a7f9fdbc5910d0a3ed64130e8e1Douglas Gregor    void VisitNamespaceDecl(NamespaceDecl *D);
666ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitUsingDirectiveDecl(UsingDirectiveDecl *D);
676ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitNamespaceAliasDecl(NamespaceAliasDecl *D);
68698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitTypeDecl(TypeDecl *TD);
69698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitTypedefDecl(TypedefDecl *TD);
708f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidis    void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D);
71698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitTagDecl(TagDecl *TD);
72698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitEnumDecl(EnumDecl *ED);
73698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitRecordDecl(RecordDecl *RD);
746ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitCXXRecordDecl(CXXRecordDecl *D);
756ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitClassTemplateSpecializationDecl(
766ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                            ClassTemplateSpecializationDecl *D);
776ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitClassTemplatePartialSpecializationDecl(
786ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                     ClassTemplatePartialSpecializationDecl *D);
796ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D);
80698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitValueDecl(ValueDecl *VD);
81698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitEnumConstantDecl(EnumConstantDecl *ECD);
828f4eae96bef0902d93535c18b69154ce66f5e546Argyrios Kyrtzidis    void VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D);
83d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis    void VisitDeclaratorDecl(DeclaratorDecl *DD);
84698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitFunctionDecl(FunctionDecl *FD);
856ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitCXXMethodDecl(CXXMethodDecl *D);
866ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitCXXConstructorDecl(CXXConstructorDecl *D);
876ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitCXXDestructorDecl(CXXDestructorDecl *D);
886ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitCXXConversionDecl(CXXConversionDecl *D);
89698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitFieldDecl(FieldDecl *FD);
90698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitVarDecl(VarDecl *VD);
91698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitImplicitParamDecl(ImplicitParamDecl *PD);
92698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitParmVarDecl(ParmVarDecl *PD);
936ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D);
946ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitTemplateDecl(TemplateDecl *D);
959eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne    void VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D);
966ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitClassTemplateDecl(ClassTemplateDecl *D);
97f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    void VisitFunctionTemplateDecl(FunctionTemplateDecl *D);
986ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D);
99b01a552d7bafb889305affe83018563620aab326Argyrios Kyrtzidis    void VisitUsingDecl(UsingDecl *D);
100b01a552d7bafb889305affe83018563620aab326Argyrios Kyrtzidis    void VisitUsingShadowDecl(UsingShadowDecl *D);
1016ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitLinkageSpecDecl(LinkageSpecDecl *D);
102698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitFileScopeAsmDecl(FileScopeAsmDecl *AD);
1036206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara    void VisitAccessSpecDecl(AccessSpecDecl *D);
1046764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis    void VisitFriendDecl(FriendDecl *D);
1056ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitFriendTemplateDecl(FriendTemplateDecl *D);
1066ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    void VisitStaticAssertDecl(StaticAssertDecl *D);
107698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitBlockDecl(BlockDecl *BD);
1086ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
109698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    std::pair<uint64_t, uint64_t> VisitDeclContext(DeclContext *DC);
110a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    template <typename T> void VisitRedeclarable(Redeclarable<T> *D);
1116ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
1129a55591af3e5506b95a9718e15380129fbfc5ebcSean Hunt    // FIXME: Reorder according to DeclNodes.td?
113698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCMethodDecl(ObjCMethodDecl *D);
114698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCContainerDecl(ObjCContainerDecl *D);
115698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCInterfaceDecl(ObjCInterfaceDecl *D);
116698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCIvarDecl(ObjCIvarDecl *D);
117698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCProtocolDecl(ObjCProtocolDecl *D);
118698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *D);
119698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCClassDecl(ObjCClassDecl *D);
120698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *D);
121698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCCategoryDecl(ObjCCategoryDecl *D);
122698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCImplDecl(ObjCImplDecl *D);
123698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D);
124698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCImplementationDecl(ObjCImplementationDecl *D);
125698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *D);
126698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCPropertyDecl(ObjCPropertyDecl *D);
127698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    void VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D);
128698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  };
129698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
130698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
131d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redluint64_t ASTDeclReader::GetCurrentCursorOffset() {
132577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  uint64_t Off = 0;
133577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  for (unsigned I = 0, N = Reader.Chain.size(); I != N; ++I) {
134c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl    ASTReader::PerFileData &F = *Reader.Chain[N - I - 1];
135577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    if (&Cursor == &F.DeclsCursor) {
136577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl      Off += F.DeclsCursor.GetCurrentBitNo();
137577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl      break;
138577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    }
139577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    Off += F.SizeInBits;
140577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  }
141577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  return Off;
142577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl}
143577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl
144d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::Visit(Decl *D) {
145d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl  DeclVisitor<ASTDeclReader, void>::Visit(D);
146d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis
14791468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis  if (TypeDecl *TD = dyn_cast<TypeDecl>(D)) {
148deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor    // if we have a fully initialized TypeDecl, we can safely read its type now.
149deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor    TD->setTypeForDecl(Reader.GetType(TypeIDForTypeDecl).getTypePtr());
15091468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis  } else if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
15191468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis    // FunctionDecl's body was written last after all other Stmts/Exprs.
15291468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis    if (Record[Idx++])
153577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl      FD->setLazyBody(GetCurrentCursorOffset());
15491468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis  }
155d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis}
156d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis
157d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitDecl(Decl *D) {
158698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setDeclContext(cast_or_null<DeclContext>(Reader.GetDecl(Record[Idx++])));
159698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setLexicalDeclContext(
160698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                     cast_or_null<DeclContext>(Reader.GetDecl(Record[Idx++])));
161c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setLocation(ReadSourceLocation(Record, Idx));
162698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setInvalidDecl(Record[Idx++]);
163cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt  if (Record[Idx++]) {
164cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt    AttrVec Attrs;
165c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    Reader.ReadAttributes(F, Attrs);
166cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt    D->setAttrs(Attrs);
167cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt  }
168698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setImplicit(Record[Idx++]);
169e0762c92110dfdcdd207db461a4ea17afd168f1eDouglas Gregor  D->setUsed(Record[Idx++]);
170698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setAccess((AccessSpecifier)Record[Idx++]);
1717d1d49d2971b20a97b3c2a301470b9eaaa130137Douglas Gregor  D->setPCHLevel(Record[Idx++] + 1);
172698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
173698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
174d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTranslationUnitDecl(TranslationUnitDecl *TU) {
175698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitDecl(TU);
1766ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  TU->setAnonymousNamespace(
1776ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                    cast_or_null<NamespaceDecl>(Reader.GetDecl(Record[Idx++])));
178698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
179698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
180d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitNamedDecl(NamedDecl *ND) {
181698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitDecl(ND);
1821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  ND->setDeclName(Reader.ReadDeclarationName(Record, Idx));
183698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
184698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
185d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTypeDecl(TypeDecl *TD) {
186698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitNamedDecl(TD);
187d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis  // Delay type reading until after we have fully initialized the decl.
188deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  TypeIDForTypeDecl = Record[Idx++];
189698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
190698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
191d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTypedefDecl(TypedefDecl *TD) {
192d8a0c6f92c13b06f24ef894099b9fca1004d445bArgyrios Kyrtzidis  VisitTypeDecl(TD);
193c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TD->setTypeSourceInfo(GetTypeSourceInfo(Record, Idx));
194698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
195698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
196d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTagDecl(TagDecl *TD) {
197698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitTypeDecl(TD);
198a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  VisitRedeclarable(TD);
1996b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  TD->IdentifierNamespace = Record[Idx++];
200698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  TD->setTagKind((TagDecl::TagKind)Record[Idx++]);
201698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  TD->setDefinition(Record[Idx++]);
202b37b648b3f2bba4c557a1604ced19b526b25a372Douglas Gregor  TD->setEmbeddedInDeclarator(Record[Idx++]);
203c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TD->setRBraceLoc(ReadSourceLocation(Record, Idx));
204c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TD->setTagKeywordLoc(ReadSourceLocation(Record, Idx));
205b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall  // FIXME: maybe read optional qualifier and its range.
206b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall  TD->setTypedefForAnonDecl(
207b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall                    cast_or_null<TypedefDecl>(Reader.GetDecl(Record[Idx++])));
208698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
209698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
210d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitEnumDecl(EnumDecl *ED) {
211698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitTagDecl(ED);
212698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  ED->setIntegerType(Reader.GetType(Record[Idx++]));
213842aef8d942a880eeb9535d40de31a86838264cbJohn McCall  ED->setPromotionType(Reader.GetType(Record[Idx++]));
2141b5a618c59025898806160ed5e7f0ff5bb79e482John McCall  ED->setNumPositiveBits(Record[Idx++]);
2151b5a618c59025898806160ed5e7f0ff5bb79e482John McCall  ED->setNumNegativeBits(Record[Idx++]);
21674228274ba9b27a26a311010b02c371f558e3bfcArgyrios Kyrtzidis  ED->setInstantiationOfMemberEnum(
21774228274ba9b27a26a311010b02c371f558e3bfcArgyrios Kyrtzidis                         cast_or_null<EnumDecl>(Reader.GetDecl(Record[Idx++])));
218698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
219698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
220d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitRecordDecl(RecordDecl *RD) {
221698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitTagDecl(RD);
222698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  RD->setHasFlexibleArrayMember(Record[Idx++]);
223698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  RD->setAnonymousStructOrUnion(Record[Idx++]);
224643b7dfb7803003d62e18da65cbe81ad001851b7Fariborz Jahanian  RD->setHasObjectMember(Record[Idx++]);
225698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
226698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
227d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitValueDecl(ValueDecl *VD) {
228698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitNamedDecl(VD);
229698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VD->setType(Reader.GetType(Record[Idx++]));
230698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
231698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
232d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitEnumConstantDecl(EnumConstantDecl *ECD) {
233698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitValueDecl(ECD);
234698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  if (Record[Idx++])
235c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    ECD->setInitExpr(Reader.ReadExpr(F));
236698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  ECD->setInitVal(Reader.ReadAPSInt(Record, Idx));
237698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
238698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
239d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitDeclaratorDecl(DeclaratorDecl *DD) {
240d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis  VisitValueDecl(DD);
241c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TypeSourceInfo *TInfo = GetTypeSourceInfo(Record, Idx);
242a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall  if (TInfo)
243a93c934af4fbf97cbe8e649d82e68ccacfe57c95John McCall    DD->setTypeSourceInfo(TInfo);
244b6217665c6a987f2d6c8665fd70365d7719ac4dfJohn McCall  // FIXME: read optional qualifier and its range.
245d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis}
246d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis
247d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFunctionDecl(FunctionDecl *FD) {
248d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis  VisitDeclaratorDecl(FD);
2496b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  VisitRedeclarable(FD);
2502577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  // FIXME: read DeclarationNameLoc.
2516ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
252c8f9af2943699ff623ca08f2e5ed4d72e0351189Argyrios Kyrtzidis  FD->IdentifierNamespace = Record[Idx++];
253f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  switch ((FunctionDecl::TemplatedKind)Record[Idx++]) {
254dc767e368471288bef8716d19b0e929647246bfcArgyrios Kyrtzidis  default: assert(false && "Unhandled TemplatedKind!");
255dc767e368471288bef8716d19b0e929647246bfcArgyrios Kyrtzidis    break;
256f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  case FunctionDecl::TK_NonTemplate:
257f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    break;
258f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  case FunctionDecl::TK_FunctionTemplate:
259f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    FD->setDescribedFunctionTemplate(
260f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis                     cast<FunctionTemplateDecl>(Reader.GetDecl(Record[Idx++])));
261f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    break;
262f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  case FunctionDecl::TK_MemberSpecialization: {
263f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    FunctionDecl *InstFD = cast<FunctionDecl>(Reader.GetDecl(Record[Idx++]));
264f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++];
265c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SourceLocation POI = ReadSourceLocation(Record, Idx);
2666b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis    FD->setInstantiationOfMemberFunction(*Reader.getContext(), InstFD, TSK);
267f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    FD->getMemberSpecializationInfo()->setPointOfInstantiation(POI);
268f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    break;
269f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  }
270f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  case FunctionDecl::TK_FunctionTemplateSpecialization: {
271f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    FunctionTemplateDecl *Template
272f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis      = cast<FunctionTemplateDecl>(Reader.GetDecl(Record[Idx++]));
273f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++];
274f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis
275f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    // Template arguments.
276f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    llvm::SmallVector<TemplateArgument, 8> TemplArgs;
277c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    Reader.ReadTemplateArgumentList(TemplArgs, F, Record, Idx);
278f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis
279f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    // Template args as written.
280f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    llvm::SmallVector<TemplateArgumentLoc, 8> TemplArgLocs;
281f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    SourceLocation LAngleLoc, RAngleLoc;
2825efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis    if (Record[Idx++]) {  // TemplateArgumentsAsWritten != 0
2835efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis      unsigned NumTemplateArgLocs = Record[Idx++];
2845efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis      TemplArgLocs.reserve(NumTemplateArgLocs);
2855efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis      for (unsigned i=0; i != NumTemplateArgLocs; ++i)
286577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl        TemplArgLocs.push_back(
287c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl            Reader.ReadTemplateArgumentLoc(F, Record, Idx));
2885efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis
289c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      LAngleLoc = ReadSourceLocation(Record, Idx);
290c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      RAngleLoc = ReadSourceLocation(Record, Idx);
291f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    }
2927b081c8604efd33bc7f7e5c1e9427a031eedb2b4Argyrios Kyrtzidis
293c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SourceLocation POI = ReadSourceLocation(Record, Idx);
294f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis
295a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis    ASTContext &C = *Reader.getContext();
296a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis    TemplateArgumentList *TemplArgList
297a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis      = new (C) TemplateArgumentList(C, TemplArgs.data(), TemplArgs.size());
298a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis    TemplateArgumentListInfo *TemplArgsInfo
299a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis      = new (C) TemplateArgumentListInfo(LAngleLoc, RAngleLoc);
300a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis    for (unsigned i=0, e = TemplArgLocs.size(); i != e; ++i)
301a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis      TemplArgsInfo->addArgument(TemplArgLocs[i]);
302a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis    FunctionTemplateSpecializationInfo *FTInfo
303a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis        = FunctionTemplateSpecializationInfo::Create(C, FD, Template, TSK,
304a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis                                                     TemplArgList,
305a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis                                                     TemplArgsInfo, POI);
306a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis    FD->TemplateOrSpecialization = FTInfo;
3076b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis
308a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis    if (FD->isCanonicalDecl()) { // if canonical add to template's set.
30999a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis      // The template that contains the specializations set. It's not safe to
31099a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis      // use getCanonicalDecl on Template since it may still be initializing.
31199a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis      FunctionTemplateDecl *CanonTemplate
31299a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis        = cast<FunctionTemplateDecl>(Reader.GetDecl(Record[Idx++]));
313a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis      // Get the InsertPos by FindNodeOrInsertPos() instead of calling
314a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis      // InsertNode(FTInfo) directly to avoid the getASTContext() call in
315a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis      // FunctionTemplateSpecializationInfo's Profile().
316a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis      // We avoid getASTContext because a decl in the parent hierarchy may
317a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis      // be initializing.
3186b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis      llvm::FoldingSetNodeID ID;
3196b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis      FunctionTemplateSpecializationInfo::Profile(ID, TemplArgs.data(),
3206b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis                                                  TemplArgs.size(), C);
3216b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis      void *InsertPos = 0;
32299a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis      CanonTemplate->getSpecializations().FindNodeOrInsertPos(ID, InsertPos);
323a626a3d0fb74455651f742c0938902a42e6e71c8Argyrios Kyrtzidis      assert(InsertPos && "Another specialization already inserted!");
32499a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis      CanonTemplate->getSpecializations().InsertNode(FTInfo, InsertPos);
3256b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis    }
326dc767e368471288bef8716d19b0e929647246bfcArgyrios Kyrtzidis    break;
327f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  }
328f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  case FunctionDecl::TK_DependentFunctionTemplateSpecialization: {
329f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    // Templates.
330f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    UnresolvedSet<8> TemplDecls;
331f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    unsigned NumTemplates = Record[Idx++];
332f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    while (NumTemplates--)
333f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis      TemplDecls.addDecl(cast<NamedDecl>(Reader.GetDecl(Record[Idx++])));
334f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis
335f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    // Templates args.
336f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    TemplateArgumentListInfo TemplArgs;
337f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    unsigned NumArgs = Record[Idx++];
338f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    while (NumArgs--)
339c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      TemplArgs.addArgument(Reader.ReadTemplateArgumentLoc(F, Record, Idx));
340c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    TemplArgs.setLAngleLoc(ReadSourceLocation(Record, Idx));
341c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    TemplArgs.setRAngleLoc(ReadSourceLocation(Record, Idx));
342f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis
343f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    FD->setDependentTemplateSpecialization(*Reader.getContext(),
344f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis                                           TemplDecls, TemplArgs);
345dc767e368471288bef8716d19b0e929647246bfcArgyrios Kyrtzidis    break;
346f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  }
347f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  }
3485efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis
349d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl  // FunctionDecl's body is handled last at ASTDeclReader::Visit,
35091468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis  // after everything else is read.
35191468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis
352d931b086984257de68868a64a235c2b4b34003fbJohn McCall  FD->setStorageClass((StorageClass)Record[Idx++]);
353d931b086984257de68868a64a235c2b4b34003fbJohn McCall  FD->setStorageClassAsWritten((StorageClass)Record[Idx++]);
3545efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis  FD->setInlineSpecified(Record[Idx++]);
3555efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis  FD->setVirtualAsWritten(Record[Idx++]);
3565efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis  FD->setPure(Record[Idx++]);
3575efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis  FD->setHasInheritedPrototype(Record[Idx++]);
3585efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis  FD->setHasWrittenPrototype(Record[Idx++]);
3595efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis  FD->setDeleted(Record[Idx++]);
3605efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis  FD->setTrivial(Record[Idx++]);
3615efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis  FD->setHasImplicitReturnZero(Record[Idx++]);
362c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  FD->setLocEnd(ReadSourceLocation(Record, Idx));
3635efb06f306c6526ad02ee2c166cbf67c04e38311Argyrios Kyrtzidis
3646ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  // Read in the parameters.
365698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned NumParams = Record[Idx++];
366698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  llvm::SmallVector<ParmVarDecl *, 16> Params;
367698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  Params.reserve(NumParams);
368698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  for (unsigned I = 0; I != NumParams; ++I)
369698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    Params.push_back(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++])));
3706b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  FD->setParams(*Reader.getContext(), Params.data(), NumParams);
371698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
372698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
373d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCMethodDecl(ObjCMethodDecl *MD) {
374698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitNamedDecl(MD);
375698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  if (Record[Idx++]) {
376698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    // In practice, this won't be executed (since method definitions
377698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    // don't occur in header files).
378c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    MD->setBody(Reader.ReadStmt(F));
379698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    MD->setSelfDecl(cast<ImplicitParamDecl>(Reader.GetDecl(Record[Idx++])));
380698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    MD->setCmdDecl(cast<ImplicitParamDecl>(Reader.GetDecl(Record[Idx++])));
381698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  }
382698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  MD->setInstanceMethod(Record[Idx++]);
383698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  MD->setVariadic(Record[Idx++]);
384698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  MD->setSynthesized(Record[Idx++]);
3853fe104154dd2e8ffb351142d74f308938b5c99bfFariborz Jahanian  MD->setDefined(Record[Idx++]);
386698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  MD->setDeclImplementation((ObjCMethodDecl::ImplementationControl)Record[Idx++]);
387698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  MD->setObjCDeclQualifier((Decl::ObjCDeclQualifier)Record[Idx++]);
3887732cc9c0fdc97a2f8cce4e5933d8103213d1aefFariborz Jahanian  MD->setNumSelectorArgs(unsigned(Record[Idx++]));
389698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  MD->setResultType(Reader.GetType(Record[Idx++]));
390c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  MD->setResultTypeSourceInfo(GetTypeSourceInfo(Record, Idx));
391c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  MD->setEndLoc(ReadSourceLocation(Record, Idx));
392698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned NumParams = Record[Idx++];
393698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  llvm::SmallVector<ParmVarDecl *, 16> Params;
394698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  Params.reserve(NumParams);
395698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  for (unsigned I = 0; I != NumParams; ++I)
396698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    Params.push_back(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++])));
3974ecb25fa94897b2c03510292acace710e5262ba5Fariborz Jahanian  MD->setMethodParams(*Reader.getContext(), Params.data(), NumParams,
3984ecb25fa94897b2c03510292acace710e5262ba5Fariborz Jahanian                      NumParams);
399698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
400698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
401d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCContainerDecl(ObjCContainerDecl *CD) {
402698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitNamedDecl(CD);
403c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  SourceLocation A = ReadSourceLocation(Record, Idx);
404c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  SourceLocation B = ReadSourceLocation(Record, Idx);
405782f2f52b78d8ca785110398a7f7b56b830b9ac7Ted Kremenek  CD->setAtEndRange(SourceRange(A, B));
406698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
407698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
408d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCInterfaceDecl(ObjCInterfaceDecl *ID) {
409698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitObjCContainerDecl(ID);
410deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  ID->setTypeForDecl(Reader.GetType(Record[Idx++]).getTypePtr());
411698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  ID->setSuperClass(cast_or_null<ObjCInterfaceDecl>
412698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                       (Reader.GetDecl(Record[Idx++])));
41353b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek
41453b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek  // Read the directly referenced protocols and their SourceLocations.
415698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned NumProtocols = Record[Idx++];
416698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  llvm::SmallVector<ObjCProtocolDecl *, 16> Protocols;
417698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  Protocols.reserve(NumProtocols);
418698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  for (unsigned I = 0; I != NumProtocols; ++I)
419698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    Protocols.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++])));
42018df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  llvm::SmallVector<SourceLocation, 16> ProtoLocs;
42118df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  ProtoLocs.reserve(NumProtocols);
42218df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  for (unsigned I = 0; I != NumProtocols; ++I)
423c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    ProtoLocs.push_back(ReadSourceLocation(Record, Idx));
42418df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  ID->setProtocolList(Protocols.data(), NumProtocols, ProtoLocs.data(),
42518df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor                      *Reader.getContext());
42653b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek
42753b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek  // Read the transitive closure of protocols referenced by this class.
42853b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek  NumProtocols = Record[Idx++];
42953b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek  Protocols.clear();
43053b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek  Protocols.reserve(NumProtocols);
43153b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek  for (unsigned I = 0; I != NumProtocols; ++I)
43253b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek    Protocols.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++])));
43353b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek  ID->AllReferencedProtocols.set(Protocols.data(), NumProtocols,
43453b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek                                 *Reader.getContext());
43553b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek
43653b9441b5a81a24fa1f66f3f6416f1e36baa9c2fTed Kremenek  // Read the ivars.
437698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned NumIvars = Record[Idx++];
438698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  llvm::SmallVector<ObjCIvarDecl *, 16> IVars;
439698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  IVars.reserve(NumIvars);
440698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  for (unsigned I = 0; I != NumIvars; ++I)
441698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    IVars.push_back(cast<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++])));
442698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  ID->setCategoryList(
443698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner               cast_or_null<ObjCCategoryDecl>(Reader.GetDecl(Record[Idx++])));
4442c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian  // We will rebuild this list lazily.
4452c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian  ID->setIvarList(0);
446deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  ID->setForwardDecl(Record[Idx++]);
447deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor  ID->setImplicitInterfaceDecl(Record[Idx++]);
448c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  ID->setClassLoc(ReadSourceLocation(Record, Idx));
449c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  ID->setSuperClassLoc(ReadSourceLocation(Record, Idx));
450c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  ID->setLocEnd(ReadSourceLocation(Record, Idx));
451698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
452698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
453d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCIvarDecl(ObjCIvarDecl *IVD) {
454698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitFieldDecl(IVD);
455698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  IVD->setAccessControl((ObjCIvarDecl::AccessControl)Record[Idx++]);
4562c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian  // This field will be built lazily.
4572c18bb7c9fca66c30b6eabbdcbc6399d24a54fa9Fariborz Jahanian  IVD->setNextIvar(0);
458ac0021ba802e193e0f9f8207768c7862c7603bc0Fariborz Jahanian  bool synth = Record[Idx++];
459ac0021ba802e193e0f9f8207768c7862c7603bc0Fariborz Jahanian  IVD->setSynthesize(synth);
460698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
461698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
462d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCProtocolDecl(ObjCProtocolDecl *PD) {
463698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitObjCContainerDecl(PD);
464698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  PD->setForwardDecl(Record[Idx++]);
465c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  PD->setLocEnd(ReadSourceLocation(Record, Idx));
466698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned NumProtoRefs = Record[Idx++];
467698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  llvm::SmallVector<ObjCProtocolDecl *, 16> ProtoRefs;
468698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  ProtoRefs.reserve(NumProtoRefs);
469698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  for (unsigned I = 0; I != NumProtoRefs; ++I)
470698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    ProtoRefs.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++])));
47118df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  llvm::SmallVector<SourceLocation, 16> ProtoLocs;
47218df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  ProtoLocs.reserve(NumProtoRefs);
47318df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  for (unsigned I = 0; I != NumProtoRefs; ++I)
474c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    ProtoLocs.push_back(ReadSourceLocation(Record, Idx));
47518df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  PD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(),
47618df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor                      *Reader.getContext());
477698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
478698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
479d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCAtDefsFieldDecl(ObjCAtDefsFieldDecl *FD) {
480698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitFieldDecl(FD);
481698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
482698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
483d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCClassDecl(ObjCClassDecl *CD) {
484698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitDecl(CD);
485698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned NumClassRefs = Record[Idx++];
486698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  llvm::SmallVector<ObjCInterfaceDecl *, 16> ClassRefs;
487698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  ClassRefs.reserve(NumClassRefs);
488698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  for (unsigned I = 0; I != NumClassRefs; ++I)
489698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    ClassRefs.push_back(cast<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])));
490321c22f1c4271c3d9a3d4d3fc18847f948ab595bTed Kremenek  llvm::SmallVector<SourceLocation, 16> SLocs;
491321c22f1c4271c3d9a3d4d3fc18847f948ab595bTed Kremenek  SLocs.reserve(NumClassRefs);
492321c22f1c4271c3d9a3d4d3fc18847f948ab595bTed Kremenek  for (unsigned I = 0; I != NumClassRefs; ++I)
493c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SLocs.push_back(ReadSourceLocation(Record, Idx));
494321c22f1c4271c3d9a3d4d3fc18847f948ab595bTed Kremenek  CD->setClassList(*Reader.getContext(), ClassRefs.data(), SLocs.data(),
495321c22f1c4271c3d9a3d4d3fc18847f948ab595bTed Kremenek                   NumClassRefs);
496698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
497698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
498d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCForwardProtocolDecl(ObjCForwardProtocolDecl *FPD) {
499698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitDecl(FPD);
500698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned NumProtoRefs = Record[Idx++];
501698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  llvm::SmallVector<ObjCProtocolDecl *, 16> ProtoRefs;
502698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  ProtoRefs.reserve(NumProtoRefs);
503698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  for (unsigned I = 0; I != NumProtoRefs; ++I)
504698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    ProtoRefs.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++])));
50518df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  llvm::SmallVector<SourceLocation, 16> ProtoLocs;
50618df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  ProtoLocs.reserve(NumProtoRefs);
50718df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  for (unsigned I = 0; I != NumProtoRefs; ++I)
508c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    ProtoLocs.push_back(ReadSourceLocation(Record, Idx));
50918df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  FPD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(),
51018df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor                       *Reader.getContext());
511698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
512698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
513d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCCategoryDecl(ObjCCategoryDecl *CD) {
514698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitObjCContainerDecl(CD);
515698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  CD->setClassInterface(cast<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])));
516698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned NumProtoRefs = Record[Idx++];
517698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  llvm::SmallVector<ObjCProtocolDecl *, 16> ProtoRefs;
518698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  ProtoRefs.reserve(NumProtoRefs);
519698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  for (unsigned I = 0; I != NumProtoRefs; ++I)
520698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    ProtoRefs.push_back(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++])));
52118df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  llvm::SmallVector<SourceLocation, 16> ProtoLocs;
52218df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  ProtoLocs.reserve(NumProtoRefs);
52318df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  for (unsigned I = 0; I != NumProtoRefs; ++I)
524c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    ProtoLocs.push_back(ReadSourceLocation(Record, Idx));
52518df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor  CD->setProtocolList(ProtoRefs.data(), NumProtoRefs, ProtoLocs.data(),
52618df52bbb5d28ca082064d31ae7558dbdae52377Douglas Gregor                      *Reader.getContext());
527698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  CD->setNextClassCategory(cast_or_null<ObjCCategoryDecl>(Reader.GetDecl(Record[Idx++])));
528000835d0b04345c0014c603fe6339b3bc154050eFariborz Jahanian  CD->setHasSynthBitfield(Record[Idx++]);
529c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  CD->setAtLoc(ReadSourceLocation(Record, Idx));
530c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  CD->setCategoryNameLoc(ReadSourceLocation(Record, Idx));
531698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
532698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
533d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCCompatibleAliasDecl(ObjCCompatibleAliasDecl *CAD) {
534698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitNamedDecl(CAD);
535698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  CAD->setClassInterface(cast<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])));
536698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
537698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
538d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
539698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitNamedDecl(D);
540c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setAtLoc(ReadSourceLocation(Record, Idx));
541c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setType(GetTypeSourceInfo(Record, Idx));
542698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  // FIXME: stable encoding
543698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setPropertyAttributes(
544698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                      (ObjCPropertyDecl::PropertyAttributeKind)Record[Idx++]);
54580aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian  D->setPropertyAttributesAsWritten(
54680aa1cd7973561889e51c1c152c8990a8de9c953Fariborz Jahanian                      (ObjCPropertyDecl::PropertyAttributeKind)Record[Idx++]);
547698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  // FIXME: stable encoding
548698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setPropertyImplementation(
549698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                            (ObjCPropertyDecl::PropertyControl)Record[Idx++]);
550698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setGetterName(Reader.ReadDeclarationName(Record, Idx).getObjCSelector());
551698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setSetterName(Reader.ReadDeclarationName(Record, Idx).getObjCSelector());
552698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setGetterMethodDecl(
553698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                 cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++])));
554698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setSetterMethodDecl(
555698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                 cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++])));
556698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setPropertyIvarDecl(
557698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                   cast_or_null<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++])));
558698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
559698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
560d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCImplDecl(ObjCImplDecl *D) {
561aecae629269fae3bf484baf1d109e9a89d14eeadArgyrios Kyrtzidis  VisitObjCContainerDecl(D);
562698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setClassInterface(
563698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner              cast_or_null<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])));
564698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
565698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
566d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
567698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitObjCImplDecl(D);
568698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setIdentifier(Reader.GetIdentifierInfo(Record, Idx));
569698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
570698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
571d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
572698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitObjCImplDecl(D);
573698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setSuperClass(
574698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner              cast_or_null<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])));
5759d50c0635fb213b2a1857e3f8488580f0dab2f98Argyrios Kyrtzidis  llvm::tie(D->IvarInitializers, D->NumIvarInitializers)
576c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      = Reader.ReadCXXBaseOrMemberInitializers(F, Record, Idx);
577000835d0b04345c0014c603fe6339b3bc154050eFariborz Jahanian  D->setHasSynthBitfield(Record[Idx++]);
578698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
579698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
580698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
581d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitObjCPropertyImplDecl(ObjCPropertyImplDecl *D) {
582698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitDecl(D);
583c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setAtLoc(ReadSourceLocation(Record, Idx));
584698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setPropertyDecl(
585698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner               cast_or_null<ObjCPropertyDecl>(Reader.GetDecl(Record[Idx++])));
586698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  D->setPropertyIvarDecl(
587698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                   cast_or_null<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++])));
588c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setGetterCXXConstructor(Reader.ReadExpr(F));
589c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setSetterCXXAssignment(Reader.ReadExpr(F));
590698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
591698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
592d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFieldDecl(FieldDecl *FD) {
593d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis  VisitDeclaratorDecl(FD);
594698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  FD->setMutable(Record[Idx++]);
595698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  if (Record[Idx++])
596c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    FD->setBitWidth(Reader.ReadExpr(F));
597c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  if (!FD->getDeclName()) {
598c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis    FieldDecl *Tmpl = cast_or_null<FieldDecl>(Reader.GetDecl(Record[Idx++]));
599c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis    if (Tmpl)
600c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis      Reader.getContext()->setInstantiatedFromUnnamedFieldDecl(FD, Tmpl);
601c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  }
602698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
603698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
604d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitVarDecl(VarDecl *VD) {
605d4a7e54f489dd863a1778a7d18f1b21ae983b473Argyrios Kyrtzidis  VisitDeclaratorDecl(VD);
6066b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  VisitRedeclarable(VD);
607d931b086984257de68868a64a235c2b4b34003fbJohn McCall  VD->setStorageClass((StorageClass)Record[Idx++]);
608d931b086984257de68868a64a235c2b4b34003fbJohn McCall  VD->setStorageClassAsWritten((StorageClass)Record[Idx++]);
609698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VD->setThreadSpecified(Record[Idx++]);
610698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VD->setCXXDirectInitializer(Record[Idx++]);
611324b54d3f60d92a82815512119791ce1c285b63eDouglas Gregor  VD->setExceptionVariable(Record[Idx++]);
6125077c3876beeaed32280af88244e8050078619a8Douglas Gregor  VD->setNRVOVariable(Record[Idx++]);
613698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  if (Record[Idx++])
614c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    VD->setInit(Reader.ReadExpr(F));
6159421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis
6169421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis  if (Record[Idx++]) { // HasMemberSpecializationInfo.
6179421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis    VarDecl *Tmpl = cast<VarDecl>(Reader.GetDecl(Record[Idx++]));
6189421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis    TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++];
619c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SourceLocation POI = ReadSourceLocation(Record, Idx);
6209421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis    Reader.getContext()->setInstantiatedFromStaticDataMember(VD, Tmpl, TSK,POI);
6219421adc43891e272156fab640e5d5ee5054b779cArgyrios Kyrtzidis  }
622698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
623698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
624d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitImplicitParamDecl(ImplicitParamDecl *PD) {
625698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitVarDecl(PD);
626698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
627698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
628d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitParmVarDecl(ParmVarDecl *PD) {
629698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitVarDecl(PD);
630698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  PD->setObjCDeclQualifier((Decl::ObjCDeclQualifier)Record[Idx++]);
631bf73b352acb7a2d041ce8b50171dd7f8e2b2c1bbJohn McCall  PD->setHasInheritedDefaultArg(Record[Idx++]);
632691d77f20763915fc7c9b34e29939d225fd0b4d2Argyrios Kyrtzidis  if (Record[Idx++]) // hasUninstantiatedDefaultArg.
633c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    PD->setUninstantiatedDefaultArg(Reader.ReadExpr(F));
634698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
635698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
636d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFileScopeAsmDecl(FileScopeAsmDecl *AD) {
637698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitDecl(AD);
638c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  AD->setAsmString(cast<StringLiteral>(Reader.ReadExpr(F)));
639698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
640698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
641d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitBlockDecl(BlockDecl *BD) {
642698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  VisitDecl(BD);
643c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  BD->setBody(cast_or_null<CompoundStmt>(Reader.ReadStmt(F)));
644c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  BD->setSignatureAsWritten(GetTypeSourceInfo(Record, Idx));
645698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned NumParams = Record[Idx++];
646698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  llvm::SmallVector<ParmVarDecl *, 16> Params;
647698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  Params.reserve(NumParams);
648698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  for (unsigned I = 0; I != NumParams; ++I)
649698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    Params.push_back(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++])));
650838db383b69b9fb55f55c8e9546477df198a4faaDouglas Gregor  BD->setParams(Params.data(), NumParams);
651698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
652698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
653d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitLinkageSpecDecl(LinkageSpecDecl *D) {
6546ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitDecl(D);
6556ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  D->setLanguage((LinkageSpecDecl::LanguageIDs)Record[Idx++]);
6566ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  D->setHasBraces(Record[Idx++]);
6576ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
6586ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
659d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitNamespaceDecl(NamespaceDecl *D) {
6606ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitNamedDecl(D);
661c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setLBracLoc(ReadSourceLocation(Record, Idx));
662c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setRBracLoc(ReadSourceLocation(Record, Idx));
6636ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  D->setNextNamespace(
6646ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                    cast_or_null<NamespaceDecl>(Reader.GetDecl(Record[Idx++])));
6656ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
6666ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  bool IsOriginal = Record[Idx++];
667a038c1dcface5a404d540a0d0688962cbe656af9Argyrios Kyrtzidis  D->OrigOrAnonNamespace.setInt(IsOriginal);
668a038c1dcface5a404d540a0d0688962cbe656af9Argyrios Kyrtzidis  D->OrigOrAnonNamespace.setPointer(
6696ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                    cast_or_null<NamespaceDecl>(Reader.GetDecl(Record[Idx++])));
6706ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
6716ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
672d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitNamespaceAliasDecl(NamespaceAliasDecl *D) {
6736ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitNamedDecl(D);
674c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->NamespaceLoc = ReadSourceLocation(Record, Idx);
675c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setQualifierRange(ReadSourceRange(Record, Idx));
6766ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  D->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx));
677c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->IdentLoc = ReadSourceLocation(Record, Idx);
6788ea5b9d832455247a15925398fb663d299d33238Douglas Gregor  D->Namespace = cast<NamedDecl>(Reader.GetDecl(Record[Idx++]));
6796ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
6806ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
681d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitUsingDecl(UsingDecl *D) {
6826ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitNamedDecl(D);
683c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setUsingLocation(ReadSourceLocation(Record, Idx));
684c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setNestedNameRange(ReadSourceRange(Record, Idx));
6856ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  D->setTargetNestedNameDecl(Reader.ReadNestedNameSpecifier(Record, Idx));
686ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara  // FIXME: read the DNLoc component.
6876ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
6886ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  // FIXME: It would probably be more efficient to read these into a vector
6896ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  // and then re-cosntruct the shadow decl set over that vector since it
6906ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  // would avoid existence checks.
6916ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  unsigned NumShadows = Record[Idx++];
6926ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  for(unsigned I = 0; I != NumShadows; ++I) {
69382f8e796d6ffce1d63729a2df87c1060edf6593aArgyrios Kyrtzidis    // Avoid invariant checking of UsingDecl::addShadowDecl, the decl may still
69482f8e796d6ffce1d63729a2df87c1060edf6593aArgyrios Kyrtzidis    // be initializing.
69582f8e796d6ffce1d63729a2df87c1060edf6593aArgyrios Kyrtzidis    D->Shadows.insert(cast<UsingShadowDecl>(Reader.GetDecl(Record[Idx++])));
6966ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  }
6976ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  D->setTypeName(Record[Idx++]);
698c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  NamedDecl *Pattern = cast_or_null<NamedDecl>(Reader.GetDecl(Record[Idx++]));
699c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  if (Pattern)
700c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis    Reader.getContext()->setInstantiatedFromUsingDecl(D, Pattern);
7016ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
7026ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
703d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitUsingShadowDecl(UsingShadowDecl *D) {
7046ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitNamedDecl(D);
7056ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  D->setTargetDecl(cast<NamedDecl>(Reader.GetDecl(Record[Idx++])));
7066ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  D->setUsingDecl(cast<UsingDecl>(Reader.GetDecl(Record[Idx++])));
707c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  UsingShadowDecl *Pattern
708c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis      = cast_or_null<UsingShadowDecl>(Reader.GetDecl(Record[Idx++]));
709c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  if (Pattern)
710c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis    Reader.getContext()->setInstantiatedFromUsingShadowDecl(D, Pattern);
7116ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
7126ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
713d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitUsingDirectiveDecl(UsingDirectiveDecl *D) {
7146ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitNamedDecl(D);
715c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->UsingLoc = ReadSourceLocation(Record, Idx);
716c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->NamespaceLoc = ReadSourceLocation(Record, Idx);
717c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->QualifierRange = ReadSourceRange(Record, Idx);
7180a35bceb7768fc0be62cb644a4e31d8bfd9fb44aDouglas Gregor  D->Qualifier = Reader.ReadNestedNameSpecifier(Record, Idx);
7190a35bceb7768fc0be62cb644a4e31d8bfd9fb44aDouglas Gregor  D->NominatedNamespace = cast<NamedDecl>(Reader.GetDecl(Record[Idx++]));
7200a35bceb7768fc0be62cb644a4e31d8bfd9fb44aDouglas Gregor  D->CommonAncestor = cast_or_null<DeclContext>(Reader.GetDecl(Record[Idx++]));
7216ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
7226ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
723d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitUnresolvedUsingValueDecl(UnresolvedUsingValueDecl *D) {
7246ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitValueDecl(D);
725c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setTargetNestedNameRange(ReadSourceRange(Record, Idx));
726c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setUsingLoc(ReadSourceLocation(Record, Idx));
7276ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  D->setTargetNestedNameSpecifier(Reader.ReadNestedNameSpecifier(Record, Idx));
728ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara  // FIXME: read the DNLoc component.
7296ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
7306ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
731d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitUnresolvedUsingTypenameDecl(
7326ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                               UnresolvedUsingTypenameDecl *D) {
7336ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitTypeDecl(D);
734c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->TargetNestedNameRange = ReadSourceRange(Record, Idx);
735c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->UsingLocation = ReadSourceLocation(Record, Idx);
736c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->TypenameLocation = ReadSourceLocation(Record, Idx);
7377e24256c95afb64b4d5abf201a0f9f0527cb4cf3Douglas Gregor  D->TargetNestedNameSpecifier = Reader.ReadNestedNameSpecifier(Record, Idx);
7386ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
7396ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
740d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitCXXRecordDecl(CXXRecordDecl *D) {
74137ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis  ASTContext &C = *Reader.getContext();
74237ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis
7430f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis  // We need to allocate the DefinitionData struct ahead of VisitRecordDecl
7440f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis  // so that the other CXXRecordDecls can get a pointer even when the owner
7450f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis  // is still initializing.
7460f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis  bool OwnsDefinitionData = false;
7470f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis  enum DataOwnership { Data_NoDefData, Data_Owner, Data_NotOwner };
7480f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis  switch ((DataOwnership)Record[Idx++]) {
7490f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis  default:
750d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl    assert(0 && "Out of sync with ASTDeclWriter or messed up reading");
7510f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis  case Data_NoDefData:
7520f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    break;
7530f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis  case Data_Owner:
7540f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    OwnsDefinitionData = true;
7550f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    D->DefinitionData = new (C) struct CXXRecordDecl::DefinitionData(D);
7560f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    break;
7570f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis  case Data_NotOwner:
7580f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    D->DefinitionData
7590f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis        = cast<CXXRecordDecl>(Reader.GetDecl(Record[Idx++]))->DefinitionData;
7600f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    break;
7610f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis  }
7620f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis
7630f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis  VisitRecordDecl(D);
7640f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis
7650f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis  if (OwnsDefinitionData) {
7660f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    assert(D->DefinitionData);
7670f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    struct CXXRecordDecl::DefinitionData &Data = *D->DefinitionData;
7680f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis
7690f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.UserDeclaredConstructor = Record[Idx++];
7700f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.UserDeclaredCopyConstructor = Record[Idx++];
7710f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.UserDeclaredCopyAssignment = Record[Idx++];
7720f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.UserDeclaredDestructor = Record[Idx++];
7730f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.Aggregate = Record[Idx++];
7740f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.PlainOldData = Record[Idx++];
7750f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.Empty = Record[Idx++];
7760f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.Polymorphic = Record[Idx++];
7770f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.Abstract = Record[Idx++];
7780f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.HasTrivialConstructor = Record[Idx++];
7790f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.HasTrivialCopyConstructor = Record[Idx++];
7800f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.HasTrivialCopyAssignment = Record[Idx++];
7810f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.HasTrivialDestructor = Record[Idx++];
7820f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.ComputedVisibleConversions = Record[Idx++];
7830f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.DeclaredDefaultConstructor = Record[Idx++];
7840f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.DeclaredCopyConstructor = Record[Idx++];
7850f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.DeclaredCopyAssignment = Record[Idx++];
7860f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.DeclaredDestructor = Record[Idx++];
7870f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis
7880f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    // setBases() is unsuitable since it may try to iterate the bases of an
7895606220447c7901ba8d80147ddab893bb7949dd5Nick Lewycky    // uninitialized base.
7900f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.NumBases = Record[Idx++];
7910f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.Bases = new(C) CXXBaseSpecifier [Data.NumBases];
7920f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    for (unsigned i = 0; i != Data.NumBases; ++i)
793c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      Data.Bases[i] = Reader.ReadCXXBaseSpecifier(F, Record, Idx);
7940f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis
7950f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    // FIXME: Make VBases lazily computed when needed to avoid storing them.
7960f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.NumVBases = Record[Idx++];
7970f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.VBases = new(C) CXXBaseSpecifier [Data.NumVBases];
7980f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    for (unsigned i = 0; i != Data.NumVBases; ++i)
799c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      Data.VBases[i] = Reader.ReadCXXBaseSpecifier(F, Record, Idx);
8000f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis
8010f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Reader.ReadUnresolvedSet(Data.Conversions, Record, Idx);
8020f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Reader.ReadUnresolvedSet(Data.VisibleConversions, Record, Idx);
8030f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    assert(Data.Definition && "Data.Definition should be already set!");
8040f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis    Data.FirstFriend
8050f47bb98cbc52a6ead2aef8a2f8315c0b6167e6cArgyrios Kyrtzidis        = cast_or_null<FriendDecl>(Reader.GetDecl(Record[Idx++]));
80637ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis  }
80737ffed3b7f229844cae2463ff82b527506c86c74Argyrios Kyrtzidis
8088731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  enum CXXRecKind {
8098731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    CXXRecNotTemplate = 0, CXXRecTemplate, CXXRecMemberSpecialization
8108731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  };
8118731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  switch ((CXXRecKind)Record[Idx++]) {
8128731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  default:
813d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl    assert(false && "Out of sync with ASTDeclWriter::VisitCXXRecordDecl?");
8148731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  case CXXRecNotTemplate:
8158731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    break;
8168731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  case CXXRecTemplate:
8178b996b8cb4b4711b260b0cf21ba388d3909af10dArgyrios Kyrtzidis    D->TemplateOrInstantiation
8188b996b8cb4b4711b260b0cf21ba388d3909af10dArgyrios Kyrtzidis        = cast<ClassTemplateDecl>(Reader.GetDecl(Record[Idx++]));
8198731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    break;
8208731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  case CXXRecMemberSpecialization: {
8218731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    CXXRecordDecl *RD = cast<CXXRecordDecl>(Reader.GetDecl(Record[Idx++]));
8228731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    TemplateSpecializationKind TSK = (TemplateSpecializationKind)Record[Idx++];
823c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SourceLocation POI = ReadSourceLocation(Record, Idx);
8248b996b8cb4b4711b260b0cf21ba388d3909af10dArgyrios Kyrtzidis    MemberSpecializationInfo *MSI = new (C) MemberSpecializationInfo(RD, TSK);
8258b996b8cb4b4711b260b0cf21ba388d3909af10dArgyrios Kyrtzidis    MSI->setPointOfInstantiation(POI);
8268b996b8cb4b4711b260b0cf21ba388d3909af10dArgyrios Kyrtzidis    D->TemplateOrInstantiation = MSI;
8278731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    break;
8288731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  }
8298731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  }
8306ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
8316ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
832d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitCXXMethodDecl(CXXMethodDecl *D) {
8336ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitFunctionDecl(D);
834c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  unsigned NumOverridenMethods = Record[Idx++];
835c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  while (NumOverridenMethods--) {
836c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis    CXXMethodDecl *MD = cast<CXXMethodDecl>(Reader.GetDecl(Record[Idx++]));
837c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis    // Avoid invariant checking of CXXMethodDecl::addOverriddenMethod,
838c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis    // MD may be initializing.
839c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis    Reader.getContext()->addOverriddenMethod(D, MD);
840c91e9f439ae85d5f79a6b65672f1d7d1b55ccda0Argyrios Kyrtzidis  }
8416ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
8426ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
843d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitCXXConstructorDecl(CXXConstructorDecl *D) {
8446ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitCXXMethodDecl(D);
84591468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis
84691468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis  D->IsExplicitSpecified = Record[Idx++];
84791468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis  D->ImplicitlyDefined = Record[Idx++];
8488e706f4b8da141612861e127610141b8d17a9667Argyrios Kyrtzidis  llvm::tie(D->BaseOrMemberInitializers, D->NumBaseOrMemberInitializers)
849c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      = Reader.ReadCXXBaseOrMemberInitializers(F, Record, Idx);
8506ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
8516ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
852d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitCXXDestructorDecl(CXXDestructorDecl *D) {
8536ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitCXXMethodDecl(D);
85491468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis
85591468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis  D->ImplicitlyDefined = Record[Idx++];
85691468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis  D->OperatorDelete = cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++]));
8576ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
8586ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
859d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitCXXConversionDecl(CXXConversionDecl *D) {
8606ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner  VisitCXXMethodDecl(D);
86191468328268f8be076c399e8482ec3cf98fe90ccArgyrios Kyrtzidis  D->IsExplicitSpecified = Record[Idx++];
8626ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
8636ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
864d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitAccessSpecDecl(AccessSpecDecl *D) {
8656206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara  VisitDecl(D);
866c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->setColonLoc(ReadSourceLocation(Record, Idx));
8676206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara}
8686206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara
869d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFriendDecl(FriendDecl *D) {
870c8f9af2943699ff623ca08f2e5ed4d72e0351189Argyrios Kyrtzidis  VisitDecl(D);
8716764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis  if (Record[Idx++])
872c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    D->Friend = GetTypeSourceInfo(Record, Idx);
8736764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis  else
8746764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis    D->Friend = cast<NamedDecl>(Reader.GetDecl(Record[Idx++]));
8756764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis  D->NextFriend = cast_or_null<FriendDecl>(Reader.GetDecl(Record[Idx++]));
876c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->FriendLoc = ReadSourceLocation(Record, Idx);
8776764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis}
8786764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis
879d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFriendTemplateDecl(FriendTemplateDecl *D) {
880554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis  VisitDecl(D);
881554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis  unsigned NumParams = Record[Idx++];
882554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis  D->NumParams = NumParams;
883554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis  D->Params = new TemplateParameterList*[NumParams];
884554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis  for (unsigned i = 0; i != NumParams; ++i)
885c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    D->Params[i] = Reader.ReadTemplateParameterList(F, Record, Idx);
886554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis  if (Record[Idx++]) // HasFriendDecl
887554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis    D->Friend = cast<NamedDecl>(Reader.GetDecl(Record[Idx++]));
888554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis  else
889c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    D->Friend = GetTypeSourceInfo(Record, Idx);
890c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->FriendLoc = ReadSourceLocation(Record, Idx);
8916ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
8926ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
893d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTemplateDecl(TemplateDecl *D) {
8948731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  VisitNamedDecl(D);
8958731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis
896bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis  NamedDecl *TemplatedDecl
897bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis    = cast_or_null<NamedDecl>(Reader.GetDecl(Record[Idx++]));
898dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  TemplateParameterList* TemplateParams
899c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      = Reader.ReadTemplateParameterList(F, Record, Idx);
9008731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  D->init(TemplatedDecl, TemplateParams);
9016ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
9026ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
903d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D) {
9046b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  // Initialize CommonOrPrev before VisitTemplateDecl so that getCommonPtr()
9056b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  // can be used while this is still initializing.
9068731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis
9076b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  assert(D->CommonOrPrev.isNull() && "getCommonPtr was called earlier on this");
9089eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  RedeclarableTemplateDecl *PrevDecl =
9099eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne      cast_or_null<RedeclarableTemplateDecl>(Reader.GetDecl(Record[Idx++]));
9109eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  assert((PrevDecl == 0 || PrevDecl->getKind() == D->getKind()) &&
9119eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne         "PrevDecl kind mismatch");
9129eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  if (PrevDecl)
9139eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne    D->CommonOrPrev = PrevDecl;
9148731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  if (PrevDecl == 0) {
9156b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis    D->CommonOrPrev = D->newCommon(*Reader.getContext());
9169eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne    if (RedeclarableTemplateDecl *RTD
9179eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne          = cast_or_null<RedeclarableTemplateDecl>(Reader.GetDecl(Record[Idx++]))) {
9189eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne      assert(RTD->getKind() == D->getKind() &&
9199eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne             "InstantiatedFromMemberTemplate kind mismatch");
9209eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne      D->setInstantiatedFromMemberTemplateImpl(RTD);
9219eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne      if (Record[Idx++])
9229eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne        D->setMemberSpecialization();
9239eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne    }
9248a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne
9258a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne    RedeclarableTemplateDecl *LatestDecl =
9268a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne        cast_or_null<RedeclarableTemplateDecl>(Reader.GetDecl(Record[Idx++]));
927a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis
928a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    // This decl is a first one and the latest declaration that it points to is
9293c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl    // in the same AST file. However, if this actually needs to point to a
9303c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl    // redeclaration in another AST file, we need to update it by checking
931a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    // the FirstLatestDeclIDs map which tracks this kind of decls.
932a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    assert(Reader.GetDecl(ThisDeclID) == D && "Invalid ThisDeclID ?");
933c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl    ASTReader::FirstLatestDeclIDMap::iterator I
934a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis        = Reader.FirstLatestDeclIDs.find(ThisDeclID);
935a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    if (I != Reader.FirstLatestDeclIDs.end()) {
936a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis      Decl *NewLatest = Reader.GetDecl(I->second);
937a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis      assert((LatestDecl->getLocation().isInvalid() ||
938a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis              NewLatest->getLocation().isInvalid()  ||
939a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis              Reader.SourceMgr.isBeforeInTranslationUnit(
940a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis                                                   LatestDecl->getLocation(),
941a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis                                                   NewLatest->getLocation())) &&
942a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis             "The new latest is supposed to come after the previous latest");
943a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis      LatestDecl = cast<RedeclarableTemplateDecl>(NewLatest);
944a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    }
945a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis
9468a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne    assert(LatestDecl->getKind() == D->getKind() && "Latest kind mismatch");
9478a798a7f7d88dc9865fad7da648e5cef8580c65aPeter Collingbourne    D->getCommonPtr()->Latest = LatestDecl;
9489eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  }
9496b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis
9506b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  VisitTemplateDecl(D);
9516b5415196327fa8ef00f028ba175fafef1738ae1Argyrios Kyrtzidis  D->IdentifierNamespace = Record[Idx++];
9529eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne}
9539eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
954d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitClassTemplateDecl(ClassTemplateDecl *D) {
9559eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  VisitRedeclarableTemplateDecl(D);
9569eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne
9579eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  if (D->getPreviousDeclaration() == 0) {
9588731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    // This ClassTemplateDecl owns a CommonPtr; read it.
9598731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis
960ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis    // FoldingSets are filled in VisitClassTemplateSpecializationDecl.
9618731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    unsigned size = Record[Idx++];
962ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis    while (size--)
963ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis      cast<ClassTemplateSpecializationDecl>(Reader.GetDecl(Record[Idx++]));
9648731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis
9658731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    size = Record[Idx++];
966ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis    while (size--)
967ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis      cast<ClassTemplatePartialSpecializationDecl>(
9688731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis                                                 Reader.GetDecl(Record[Idx++]));
9698731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis
9708731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis    // InjectedClassNameType is computed.
9718731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  }
9726ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
9736ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
974d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitClassTemplateSpecializationDecl(
9756ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                           ClassTemplateSpecializationDecl *D) {
976dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  VisitCXXRecordDecl(D);
977586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis
978586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis  ASTContext &C = *Reader.getContext();
979dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  if (Decl *InstD = Reader.GetDecl(Record[Idx++])) {
980dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis    if (ClassTemplateDecl *CTD = dyn_cast<ClassTemplateDecl>(InstD)) {
981586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis      D->SpecializedTemplate = CTD;
982dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis    } else {
983dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis      llvm::SmallVector<TemplateArgument, 8> TemplArgs;
984c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      Reader.ReadTemplateArgumentList(TemplArgs, F, Record, Idx);
985586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis      TemplateArgumentList *ArgList
986586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis          = new (C) TemplateArgumentList(C, TemplArgs.data(), TemplArgs.size());
987586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis      ClassTemplateSpecializationDecl::SpecializedPartialSpecialization *PS
988586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis          = new (C) ClassTemplateSpecializationDecl::
989586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis                                             SpecializedPartialSpecialization();
990586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis      PS->PartialSpecialization
991586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis          = cast<ClassTemplatePartialSpecializationDecl>(InstD);
992586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis      PS->TemplateArgs = ArgList;
993586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis      D->SpecializedTemplate = PS;
994dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis    }
995dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  }
996dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis
997dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  // Explicit info.
998c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  if (TypeSourceInfo *TyInfo = GetTypeSourceInfo(Record, Idx)) {
999586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis    ClassTemplateSpecializationDecl::ExplicitSpecializationInfo *ExplicitInfo
1000586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis        = new (C) ClassTemplateSpecializationDecl::ExplicitSpecializationInfo;
1001586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis    ExplicitInfo->TypeAsWritten = TyInfo;
1002c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    ExplicitInfo->ExternLoc = ReadSourceLocation(Record, Idx);
1003c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    ExplicitInfo->TemplateKeywordLoc = ReadSourceLocation(Record, Idx);
1004586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis    D->ExplicitInfo = ExplicitInfo;
1005dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  }
1006dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis
1007dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  llvm::SmallVector<TemplateArgument, 8> TemplArgs;
1008c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  Reader.ReadTemplateArgumentList(TemplArgs, F, Record, Idx);
1009586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis  D->TemplateArgs.init(C, TemplArgs.data(), TemplArgs.size());
1010c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->PointOfInstantiation = ReadSourceLocation(Record, Idx);
1011586c7156d51039290f100c80d2d8bd263c99addcArgyrios Kyrtzidis  D->SpecializationKind = (TemplateSpecializationKind)Record[Idx++];
1012ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis
1013bc5ab7c9e307fea5ecb979b30815da7a370e1c05Argyrios Kyrtzidis  if (D->isCanonicalDecl()) { // It's kept in the folding set.
1014ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis    ClassTemplateDecl *CanonPattern
1015ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis                       = cast<ClassTemplateDecl>(Reader.GetDecl(Record[Idx++]));
1016ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis    if (ClassTemplatePartialSpecializationDecl *Partial
1017ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis            = dyn_cast<ClassTemplatePartialSpecializationDecl>(D)) {
10180a67eddc8fa2d6d1319deff0d52850f079753b2aArgyrios Kyrtzidis      CanonPattern->getPartialSpecializations().InsertNode(Partial);
1019ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis    } else {
10200a67eddc8fa2d6d1319deff0d52850f079753b2aArgyrios Kyrtzidis      CanonPattern->getSpecializations().InsertNode(D);
1021ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis    }
1022ecf966e837097fb2ea0a80391e129bed7361d396Argyrios Kyrtzidis  }
10236ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
10246ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
1025d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitClassTemplatePartialSpecializationDecl(
10266ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                    ClassTemplatePartialSpecializationDecl *D) {
1027dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  VisitClassTemplateSpecializationDecl(D);
1028dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis
10298fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis  ASTContext &C = *Reader.getContext();
1030c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->TemplateParams = Reader.ReadTemplateParameterList(F, Record, Idx);
10318fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis
1032dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  unsigned NumArgs = Record[Idx++];
10338fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis  if (NumArgs) {
10348fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis    D->NumArgsAsWritten = NumArgs;
10358fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis    D->ArgsAsWritten = new (C) TemplateArgumentLoc[NumArgs];
10368fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis    for (unsigned i=0; i != NumArgs; ++i)
1037c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      D->ArgsAsWritten[i] = Reader.ReadTemplateArgumentLoc(F, Record, Idx);
10388fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis  }
10398fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis
10408fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis  D->SequenceNumber = Record[Idx++];
1041dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis
1042dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  // These are read/set from/to the first declaration.
1043dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  if (D->getPreviousDeclaration() == 0) {
10448fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis    D->InstantiatedFromMember.setPointer(
1045dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis        cast_or_null<ClassTemplatePartialSpecializationDecl>(
1046dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis                                                Reader.GetDecl(Record[Idx++])));
10478fed4b4bc93cce4d15bdb79f9e30cc25a93c8143Argyrios Kyrtzidis    D->InstantiatedFromMember.setInt(Record[Idx++]);
1048dd41c14bfd7686b556de2acf6952e21a4f80b7aaArgyrios Kyrtzidis  }
10496ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
10506ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
1051d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitFunctionTemplateDecl(FunctionTemplateDecl *D) {
10529eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  VisitRedeclarableTemplateDecl(D);
1053f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis
10549eabebafc165a67812eacc184806e7bf34c5f0a5Peter Collingbourne  if (D->getPreviousDeclaration() == 0) {
1055f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    // This FunctionTemplateDecl owns a CommonPtr; read it.
1056f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis
1057057d9afdc7e8027f3b928f0dd8d7d921d7cd5615Argyrios Kyrtzidis    // Read the function specialization declarations.
1058057d9afdc7e8027f3b928f0dd8d7d921d7cd5615Argyrios Kyrtzidis    // FunctionTemplateDecl's FunctionTemplateSpecializationInfos are filled
105999a8ca0bdbf97f7b05f3f8aed05ff495caea5b84Argyrios Kyrtzidis    // when reading the specialized FunctionDecl.
1060057d9afdc7e8027f3b928f0dd8d7d921d7cd5615Argyrios Kyrtzidis    unsigned NumSpecs = Record[Idx++];
1061057d9afdc7e8027f3b928f0dd8d7d921d7cd5615Argyrios Kyrtzidis    while (NumSpecs--)
1062057d9afdc7e8027f3b928f0dd8d7d921d7cd5615Argyrios Kyrtzidis      Reader.GetDecl(Record[Idx++]);
1063f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis  }
10646ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
10656ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
1066d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
10678731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  VisitTypeDecl(D);
10688731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis
10698731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  D->setDeclaredWithTypename(Record[Idx++]);
10708731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  D->setParameterPack(Record[Idx++]);
10718731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis
10728731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  bool Inherited = Record[Idx++];
1073c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TypeSourceInfo *DefArg = GetTypeSourceInfo(Record, Idx);
10748731ca76acf81826df7048bffd0c44c7c0f96c7fArgyrios Kyrtzidis  D->setDefaultArgument(DefArg, Inherited);
10756ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
10766ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
1077d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
1078b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis  VisitVarDecl(D);
1079b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis  // TemplateParmPosition.
1080b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis  D->setDepth(Record[Idx++]);
1081b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis  D->setPosition(Record[Idx++]);
1082b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis  // Rest of NonTypeTemplateParmDecl.
1083b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis  if (Record[Idx++]) {
1084c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    Expr *DefArg = Reader.ReadExpr(F);
1085b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis    bool Inherited = Record[Idx++];
1086b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis    D->setDefaultArgument(DefArg, Inherited);
1087b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis }
10886ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
10896ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
1090d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
1091bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis  VisitTemplateDecl(D);
1092bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis  // TemplateParmPosition.
1093bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis  D->setDepth(Record[Idx++]);
1094bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis  D->setPosition(Record[Idx++]);
1095bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis  // Rest of TemplateTemplateParmDecl.
1096c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TemplateArgumentLoc Arg = Reader.ReadTemplateArgumentLoc(F, Record, Idx);
1097bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis  bool IsInherited = Record[Idx++];
1098bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis  D->setDefaultArgument(Arg, IsInherited);
10996ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
11006ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
1101d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitStaticAssertDecl(StaticAssertDecl *D) {
11020d396896998685809bda7444d772bbeb5bbe9b46Argyrios Kyrtzidis  VisitDecl(D);
1103c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->AssertExpr = Reader.ReadExpr(F);
1104c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  D->Message = cast<StringLiteral>(Reader.ReadExpr(F));
11056ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner}
11066ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
11071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstd::pair<uint64_t, uint64_t>
1108d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian RedlASTDeclReader::VisitDeclContext(DeclContext *DC) {
1109698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  uint64_t LexicalOffset = Record[Idx++];
1110698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  uint64_t VisibleOffset = Record[Idx++];
1111698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  return std::make_pair(LexicalOffset, VisibleOffset);
1112698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
1113698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1114a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidistemplate <typename T>
1115d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redlvoid ASTDeclReader::VisitRedeclarable(Redeclarable<T> *D) {
1116a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  enum RedeclKind { NoRedeclaration = 0, PointsToPrevious, PointsToLatest };
1117a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  RedeclKind Kind = (RedeclKind)Record[Idx++];
1118a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  switch (Kind) {
1119a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  default:
1120d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl    assert(0 && "Out of sync with ASTDeclWriter::VisitRedeclarable or messed up"
1121a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis                " reading");
1122a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  case NoRedeclaration:
1123a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    break;
1124a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  case PointsToPrevious:
1125a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    D->RedeclLink = typename Redeclarable<T>::PreviousDeclLink(
1126a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis                                cast_or_null<T>(Reader.GetDecl(Record[Idx++])));
1127a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    break;
1128a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  case PointsToLatest:
1129a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    D->RedeclLink = typename Redeclarable<T>::LatestDeclLink(
1130a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis                                cast_or_null<T>(Reader.GetDecl(Record[Idx++])));
1131a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    break;
1132a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  }
1133a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis
1134a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  assert(!(Kind == PointsToPrevious &&
1135a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis           Reader.FirstLatestDeclIDs.find(ThisDeclID) !=
1136a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis               Reader.FirstLatestDeclIDs.end()) &&
1137a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis         "This decl is not first, it should not be in the map");
1138a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  if (Kind == PointsToPrevious)
1139a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    return;
1140a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis
1141a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  // This decl is a first one and the latest declaration that it points to is in
11423c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl  // the same AST file. However, if this actually needs to point to a
11433c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl  // redeclaration in another AST file, we need to update it by checking the
1144a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  // FirstLatestDeclIDs map which tracks this kind of decls.
1145a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  assert(Reader.GetDecl(ThisDeclID) == static_cast<T*>(D) &&
1146a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis         "Invalid ThisDeclID ?");
1147c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl  ASTReader::FirstLatestDeclIDMap::iterator I
1148a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis      = Reader.FirstLatestDeclIDs.find(ThisDeclID);
1149a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  if (I != Reader.FirstLatestDeclIDs.end()) {
1150a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    Decl *NewLatest = Reader.GetDecl(I->second);
1151a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    assert((D->getMostRecentDeclaration()->getLocation().isInvalid() ||
1152a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis            NewLatest->getLocation().isInvalid() ||
1153a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis            Reader.SourceMgr.isBeforeInTranslationUnit(
1154a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis                                   D->getMostRecentDeclaration()->getLocation(),
1155a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis                                   NewLatest->getLocation())) &&
1156a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis           "The new latest is supposed to come after the previous latest");
1157a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis    D->RedeclLink
1158a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis        = typename Redeclarable<T>::LatestDeclLink(cast_or_null<T>(NewLatest));
1159a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis  }
1160a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis}
1161a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis
1162698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner//===----------------------------------------------------------------------===//
11634e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner// Attribute Reading
1164698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner//===----------------------------------------------------------------------===//
1165698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
11664e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner/// \brief Reads attributes from the current stream position.
1167c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redlvoid ASTReader::ReadAttributes(PerFileData &F, AttrVec &Attrs) {
1168c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  llvm::BitstreamCursor &DeclsCursor = F.DeclsCursor;
11694e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner  unsigned Code = DeclsCursor.ReadCode();
11701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  assert(Code == llvm::bitc::UNABBREV_RECORD &&
11714e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner         "Expected unabbreviated record"); (void)Code;
11721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11734e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner  RecordData Record;
11744e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner  unsigned Idx = 0;
11754e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner  unsigned RecCode = DeclsCursor.ReadRecord(Code, Record);
11768538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  assert(RecCode == DECL_ATTR && "Expected attribute record");
11774e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner  (void)RecCode;
11784e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner
11794e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner  while (Idx < Record.size()) {
11804e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner    Attr *New = 0;
1181387475d0c18aaeb022108de9d33b6c9fb7998843Sean Hunt    attr::Kind Kind = (attr::Kind)Record[Idx++];
1182c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SourceLocation Loc = ReadSourceLocation(F, Record, Idx);
1183cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt    bool isInherited = Record[Idx++];
11844e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner
1185cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt#include "clang/Serialization/AttrPCHRead.inc"
11864e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner
11874e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner    assert(New && "Unable to decode attribute?");
1188cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt    New->setInherited(isInherited);
1189cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt    Attrs.push_back(New);
11904e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner  }
11914e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner}
11924e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner
11934e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner//===----------------------------------------------------------------------===//
1194c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl// ASTReader Implementation
11954e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner//===----------------------------------------------------------------------===//
1196698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1197698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// \brief Note that we have loaded the declaration with the given
1198698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// Index.
11991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump///
1200698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// This routine notes that this declaration has already been loaded,
1201698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// so that future GetDecl calls will return this declaration rather
1202698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// than trying to load a new declaration.
1203c43b54cbc10654ed59de797898042e1a05265246Sebastian Redlinline void ASTReader::LoadedDecl(unsigned Index, Decl *D) {
1204698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  assert(!DeclsLoaded[Index] && "Decl loaded twice?");
1205698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  DeclsLoaded[Index] = D;
1206698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
1207698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1208698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1209698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// \brief Determine whether the consumer will be interested in seeing
1210698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// this declaration (via HandleTopLevelDecl).
1211698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner///
1212698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// This routine should return true for anything that might affect
1213698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// code generation, e.g., inline function definitions, Objective-C
1214698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner/// declarations with metadata, etc.
1215698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattnerstatic bool isConsumerInterestedIn(Decl *D) {
121604a0b50e19a5598330a4b42c5de2583e244df22fDaniel Dunbar  if (isa<FileScopeAsmDecl>(D))
121704a0b50e19a5598330a4b42c5de2583e244df22fDaniel Dunbar    return true;
1218698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  if (VarDecl *Var = dyn_cast<VarDecl>(D))
12193f95477f28ef3baaf79001a5654785c8b2075710Argyrios Kyrtzidis    return Var->isFileVarDecl() &&
12203f95477f28ef3baaf79001a5654785c8b2075710Argyrios Kyrtzidis           Var->isThisDeclarationADefinition() == VarDecl::Definition;
1221698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  if (FunctionDecl *Func = dyn_cast<FunctionDecl>(D))
1222698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    return Func->isThisDeclarationADefinition();
12239d50c0635fb213b2a1857e3f8488580f0dab2f98Argyrios Kyrtzidis  return isa<ObjCProtocolDecl>(D) || isa<ObjCImplementationDecl>(D);
1224698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
1225698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1226cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl/// \brief Get the correct cursor and offset for loading a type.
1227c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlASTReader::RecordLocation
12288538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlASTReader::DeclCursorForIndex(unsigned Index, DeclID ID) {
12290b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl  // See if there's an override.
12300b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl  DeclReplacementMap::iterator It = ReplacedDecls.find(ID);
12310b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl  if (It != ReplacedDecls.end())
1232c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    return RecordLocation(It->second.first, It->second.second);
12330b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl
1234cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl  PerFileData *F = 0;
1235cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl  for (unsigned I = 0, N = Chain.size(); I != N; ++I) {
1236cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl    F = Chain[N - I - 1];
1237cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl    if (Index < F->LocalNumDecls)
1238cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl      break;
1239cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl    Index -= F->LocalNumDecls;
1240cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl  }
1241cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl  assert(F && F->LocalNumDecls > Index && "Broken chain");
1242c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  return RecordLocation(F, F->DeclOffsets[Index]);
1243cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl}
1244cb526aa1184d2aa19bbfdfb1080f1fc87d9bb711Sebastian Redl
1245d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl/// \brief Read the declaration at the given offset from the AST file.
12468538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlDecl *ASTReader::ReadDeclRecord(unsigned Index, DeclID ID) {
12470b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl  RecordLocation Loc = DeclCursorForIndex(Index, ID);
1248c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  llvm::BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor;
1249698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  // Keep track of where we are in the stream, then jump back there
1250698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  // after reading this declaration.
1251da93061f56d5820725b01a140879d047554e7d32Chris Lattner  SavedStreamPosition SavedPosition(DeclsCursor);
1252698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1253919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  ReadingKindTracker ReadingKind(Read_Decl, *this);
1254919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
1255d89275bc865e2b552836c7b33e636d4f86b8de6dDouglas Gregor  // Note that we are loading a declaration record.
125629ee3a273f58e16df7f2c524ab62a869e44fc9b1Argyrios Kyrtzidis  Deserializing ADecl(this);
12571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1258c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  DeclsCursor.JumpToBit(Loc.Offset);
1259698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  RecordData Record;
1260da93061f56d5820725b01a140879d047554e7d32Chris Lattner  unsigned Code = DeclsCursor.ReadCode();
1261698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  unsigned Idx = 0;
1262c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  ASTDeclReader Reader(*this, *Loc.F, DeclsCursor, ID, Record, Idx);
1263698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1264da93061f56d5820725b01a140879d047554e7d32Chris Lattner  Decl *D = 0;
12658538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  switch ((DeclCode)DeclsCursor.ReadRecord(Code, Record)) {
12668538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_ATTR:
12678538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CONTEXT_LEXICAL:
12688538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CONTEXT_VISIBLE:
1269698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    assert(false && "Record cannot be de-serialized with ReadDeclRecord");
1270698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
12718538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_TRANSLATION_UNIT:
1272698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    assert(Index == 0 && "Translation unit must be at index 0");
1273d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = Context->getTranslationUnitDecl();
1274698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
12758538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_TYPEDEF:
1276ba6a9bd384df475780be636ca45bcef5c5bbd19fJohn McCall    D = TypedefDecl::Create(*Context, 0, SourceLocation(), 0, 0);
1277698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
12788538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_ENUM:
1279b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis    D = EnumDecl::Create(*Context, Decl::EmptyShell());
1280698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
12818538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_RECORD:
1282b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis    D = RecordDecl::Create(*Context, Decl::EmptyShell());
1283698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
12848538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_ENUM_CONSTANT:
1285d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = EnumConstantDecl::Create(*Context, 0, SourceLocation(), 0, QualType(),
1286698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                                 0, llvm::APSInt());
1287698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
12888538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_FUNCTION:
12891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    D = FunctionDecl::Create(*Context, 0, SourceLocation(), DeclarationName(),
1290a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis                             QualType(), 0);
1291698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
12928538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_LINKAGE_SPEC:
12936ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = LinkageSpecDecl::Create(*Context, 0, SourceLocation(),
12946ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                (LinkageSpecDecl::LanguageIDs)0,
12956ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                false);
12966ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
12978538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_NAMESPACE:
12986ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = NamespaceDecl::Create(*Context, 0, SourceLocation(), 0);
12996ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13008538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_NAMESPACE_ALIAS:
13016ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = NamespaceAliasDecl::Create(*Context, 0, SourceLocation(),
13026ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                   SourceLocation(), 0, SourceRange(), 0,
13036ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                   SourceLocation(), 0);
13046ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13058538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_USING:
1306ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara    D = UsingDecl::Create(*Context, 0, SourceRange(), SourceLocation(),
1307ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara                          0, DeclarationNameInfo(), false);
13086ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13098538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_USING_SHADOW:
13106ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = UsingShadowDecl::Create(*Context, 0, SourceLocation(), 0, 0);
13116ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13128538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_USING_DIRECTIVE:
13136ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = UsingDirectiveDecl::Create(*Context, 0, SourceLocation(),
13146ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                   SourceLocation(), SourceRange(), 0,
13156ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                   SourceLocation(), 0, 0);
13166ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13178538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_UNRESOLVED_USING_VALUE:
13186ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = UnresolvedUsingValueDecl::Create(*Context, 0, SourceLocation(),
1319ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara                                         SourceRange(), 0,
1320ef3dce817d43faadbf21ce9102d33a9d84b02e09Abramo Bagnara                                         DeclarationNameInfo());
13216ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13228538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_UNRESOLVED_USING_TYPENAME:
13236ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = UnresolvedUsingTypenameDecl::Create(*Context, 0, SourceLocation(),
13246ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                            SourceLocation(), SourceRange(),
13256ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                            0, SourceLocation(),
13266ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                                            DeclarationName());
13276ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13288538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CXX_RECORD:
1329b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis    D = CXXRecordDecl::Create(*Context, Decl::EmptyShell());
13306ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13318538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CXX_METHOD:
13322577743c5650c646fb705df01403707e94f2df04Abramo Bagnara    D = CXXMethodDecl::Create(*Context, 0, DeclarationNameInfo(),
13336ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner                              QualType(), 0);
13346ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13358538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CXX_CONSTRUCTOR:
13366ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = CXXConstructorDecl::Create(*Context, Decl::EmptyShell());
13376ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13388538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CXX_DESTRUCTOR:
13396ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = CXXDestructorDecl::Create(*Context, Decl::EmptyShell());
13406ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13418538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CXX_CONVERSION:
13426ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    D = CXXConversionDecl::Create(*Context, Decl::EmptyShell());
13436ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13448538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_ACCESS_SPEC:
134565b63ec1410f09e1f3cdb847018d678b8f8fc3f7Argyrios Kyrtzidis    D = AccessSpecDecl::Create(*Context, Decl::EmptyShell());
13466206d53f67613958ae1b023aba337ebb46f11a8bAbramo Bagnara    break;
13478538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_FRIEND:
13486764334dfa73d67cbbb1b1fc8fe00440aad00f2aArgyrios Kyrtzidis    D = FriendDecl::Create(*Context, Decl::EmptyShell());
13496ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13508538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_FRIEND_TEMPLATE:
1351554e6aa2da082575514607c3639c246c04b3232aArgyrios Kyrtzidis    D = FriendTemplateDecl::Create(*Context, Decl::EmptyShell());
13526ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13538538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CLASS_TEMPLATE:
13545bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis    D = ClassTemplateDecl::Create(*Context, 0, SourceLocation(),
13555bf1bdc2fedb0c29b5fcdb4abc852aa85b4fe26aArgyrios Kyrtzidis                                  DeclarationName(), 0, 0, 0);
13566ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13578538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CLASS_TEMPLATE_SPECIALIZATION:
1358b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis    D = ClassTemplateSpecializationDecl::Create(*Context, Decl::EmptyShell());
13596ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13608538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_CLASS_TEMPLATE_PARTIAL_SPECIALIZATION:
1361b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis    D = ClassTemplatePartialSpecializationDecl::Create(*Context,
1362b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis                                                            Decl::EmptyShell());
13636ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13648538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_FUNCTION_TEMPLATE:
1365f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis    D = FunctionTemplateDecl::Create(*Context, 0, SourceLocation(),
1366f511ba6277d240bbee1064715da8362a6edee5f3Argyrios Kyrtzidis                                     DeclarationName(), 0, 0);
13676ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13688538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_TEMPLATE_TYPE_PARM:
1369b8b03e6df1cc89e701a809c6a47c41f31b7a9e50Argyrios Kyrtzidis    D = TemplateTypeParmDecl::Create(*Context, Decl::EmptyShell());
13706ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13718538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_NON_TYPE_TEMPLATE_PARM:
1372b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis    D = NonTypeTemplateParmDecl::Create(*Context, 0, SourceLocation(), 0,0,0,
1373b24e199fbd17af780ab000c5862d191e4daffc0fArgyrios Kyrtzidis                                        QualType(),0);
13746ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13758538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_TEMPLATE_TEMPLATE_PARM:
1376bfcc92c3476ada55ceeea49e43e6d2e083252830Argyrios Kyrtzidis    D = TemplateTemplateParmDecl::Create(*Context, 0, SourceLocation(),0,0,0,0);
13776ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13788538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_STATIC_ASSERT:
13790d396896998685809bda7444d772bbeb5bbe9b46Argyrios Kyrtzidis    D = StaticAssertDecl::Create(*Context, 0, SourceLocation(), 0, 0);
13806ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner    break;
13816ad9ac097918fbdeb443ea7b99d4db9e49b28534Chris Lattner
13828538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_METHOD:
13831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    D = ObjCMethodDecl::Create(*Context, SourceLocation(), SourceLocation(),
13844bc1cb6aa635a5bf8fae99bf69c56c724c1e786cDouglas Gregor                               Selector(), QualType(), 0, 0);
1385698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
13868538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_INTERFACE:
1387deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor    D = ObjCInterfaceDecl::Create(*Context, 0, SourceLocation(), 0);
1388698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
13898538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_IVAR:
1390a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis    D = ObjCIvarDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 0,
1391698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                             ObjCIvarDecl::None);
1392698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
13938538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_PROTOCOL:
1394d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = ObjCProtocolDecl::Create(*Context, 0, SourceLocation(), 0);
1395698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
13968538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_AT_DEFS_FIELD:
13971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    D = ObjCAtDefsFieldDecl::Create(*Context, 0, SourceLocation(), 0,
1398698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                                    QualType(), 0);
1399698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14008538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_CLASS:
1401d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = ObjCClassDecl::Create(*Context, 0, SourceLocation());
1402698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14038538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_FORWARD_PROTOCOL:
1404d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = ObjCForwardProtocolDecl::Create(*Context, 0, SourceLocation());
1405698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14068538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_CATEGORY:
14073db211b617c5073aa70eb25d37ed44ae0dca17c4Douglas Gregor    D = ObjCCategoryDecl::Create(*Context, 0, SourceLocation(),
14083db211b617c5073aa70eb25d37ed44ae0dca17c4Douglas Gregor                                 SourceLocation(), SourceLocation(), 0);
1409698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14108538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_CATEGORY_IMPL:
1411d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = ObjCCategoryImplDecl::Create(*Context, 0, SourceLocation(), 0, 0);
1412698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14138538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_IMPLEMENTATION:
1414d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = ObjCImplementationDecl::Create(*Context, 0, SourceLocation(), 0, 0);
1415698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14168538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_COMPATIBLE_ALIAS:
1417d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = ObjCCompatibleAliasDecl::Create(*Context, 0, SourceLocation(), 0, 0);
1418698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14198538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_PROPERTY:
1420d0502407c1b41b2ace326f355d7b7a6876246223Fariborz Jahanian    D = ObjCPropertyDecl::Create(*Context, 0, SourceLocation(), 0, SourceLocation(),
142183a230c83a54190366138c1a4f4310ef838b88fcJohn McCall                                 0);
1422698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14238538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_OBJC_PROPERTY_IMPL:
1424d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = ObjCPropertyImplDecl::Create(*Context, 0, SourceLocation(),
14251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                     SourceLocation(), 0,
1426698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner                                     ObjCPropertyImplDecl::Dynamic, 0);
1427698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14288538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_FIELD:
14291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    D = FieldDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 0, 0,
1430a5d82000f7b173a0a5ce34dc8c09a03f98d9e439Argyrios Kyrtzidis                          false);
1431698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14328538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_VAR:
1433a1d5662d96465f0fddf8819d245da4d19b892effArgyrios Kyrtzidis    D = VarDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 0,
1434d931b086984257de68868a64a235c2b4b34003fbJohn McCall                        SC_None, SC_None);
1435698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
1436698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
14378538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_IMPLICIT_PARAM:
1438d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = ImplicitParamDecl::Create(*Context, 0, SourceLocation(), 0, QualType());
1439698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
1440698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
14418538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_PARM_VAR:
14421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    D = ParmVarDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 0,
1443d931b086984257de68868a64a235c2b4b34003fbJohn McCall                            SC_None, SC_None, 0);
1444698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14458538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_FILE_SCOPE_ASM:
1446d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = FileScopeAsmDecl::Create(*Context, 0, SourceLocation(), 0);
1447698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
14488538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  case DECL_BLOCK:
1449d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    D = BlockDecl::Create(*Context, 0, SourceLocation());
1450698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    break;
1451698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  }
1452698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1453d527cc06d78fe5afa5f20105b51697637eb02c56Sebastian Redl  assert(D && "Unknown declaration reading AST file");
14544e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner  LoadedDecl(Index, D);
14554e3fcc845b43a890f660a8abcee5e358882c5e8eChris Lattner  Reader.Visit(D);
1456698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1457698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  // If this declaration is also a declaration context, get the
1458698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  // offsets for its tables of lexical and visible declarations.
1459698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  if (DeclContext *DC = dyn_cast<DeclContext>(D)) {
1460698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    std::pair<uint64_t, uint64_t> Offsets = Reader.VisitDeclContext(DC);
1461698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    if (Offsets.first || Offsets.second) {
1462698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner      DC->setHasExternalLexicalStorage(Offsets.first != 0);
1463698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner      DC->setHasExternalVisibleStorage(Offsets.second != 0);
1464681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl      DeclContextInfo Info;
1465681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl      if (ReadDeclContextStorage(DeclsCursor, Offsets, Info))
1466681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl        return 0;
1467d692af71226d2fb537d86c670af96114ddd485c3Sebastian Redl      DeclContextInfos &Infos = DeclContextOffsets[DC];
1468e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl      // Reading the TU will happen after reading its lexical update blocks,
1469e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl      // so we need to make sure we insert in front. For all other contexts,
1470e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl      // the vector is empty here anyway, so there's no loss in efficiency.
1471d692af71226d2fb537d86c670af96114ddd485c3Sebastian Redl      Infos.insert(Infos.begin(), Info);
1472e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl
1473e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl      // Now add the pending visible updates for this decl context, if it has
1474e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl      // any.
1475e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl      DeclContextVisibleUpdatesPending::iterator I =
1476e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl          PendingVisibleUpdates.find(ID);
1477e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl      if (I != PendingVisibleUpdates.end()) {
1478e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl        DeclContextVisibleUpdates &U = I->second;
1479e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl        Info.LexicalDecls = 0;
1480e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl        Info.NumLexicalDecls = 0;
1481e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl        for (DeclContextVisibleUpdates::iterator UI = U.begin(), UE = U.end();
1482e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl             UI != UE; ++UI) {
1483e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl          Info.NameLookupTableData = *UI;
1484e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl          Infos.push_back(Info);
1485e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl        }
1486e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl        PendingVisibleUpdates.erase(I);
1487e1dde811b38e779894150cb1093d57f8411a84f7Sebastian Redl      }
1488698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner    }
1489698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  }
14906e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl
14916e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl  // If this is a template, read additional specializations that may be in a
14926e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl  // different part of the chain.
14936e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl  if (isa<RedeclarableTemplateDecl>(D)) {
14946e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl    AdditionalTemplateSpecializationsMap::iterator F =
14956e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl        AdditionalTemplateSpecializationsPending.find(ID);
14966e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl    if (F != AdditionalTemplateSpecializationsPending.end()) {
14976e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl      for (AdditionalTemplateSpecializations::iterator I = F->second.begin(),
14986e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl                                                       E = F->second.end();
14996e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl           I != E; ++I)
15006e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl        GetDecl(*I);
15016e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl      AdditionalTemplateSpecializationsPending.erase(F);
15026e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl    }
15036e50e00c2fe6a04b2c35592588a4b10a2c269416Sebastian Redl  }
1504698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  assert(Idx == Record.size());
1505698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1506698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  // If we have deserialized a declaration that has a definition the
1507bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis  // AST consumer might need to know about, queue it.
1508bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis  // We don't pass it to the consumer immediately because we may be in recursive
1509bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis  // loading, and some declarations may still be initializing.
1510bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis  if (isConsumerInterestedIn(D))
1511bb80a8e8887c1ec74ee135d4ad9455eafedf1508Argyrios Kyrtzidis    InterestingDecls.push_back(D);
1512698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner
1513698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner  return D;
1514698f925dedd956cf7c2d7f77ba6192eb04b31e60Chris Lattner}
1515