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