ASTReaderStmt.cpp revision 4076dacf1497fb95cb298b9d964fbdbdaf9bde6c
1904c9c8389b65ee93a706ede911accd11e0b9d8eSebastian Redl//===--- ASTReaderStmt.cpp - Stmt/Expr Deserialization ----------*- C++ -*-===//
24c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner//
34c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner//                     The LLVM Compiler Infrastructure
44c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner//
54c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner// This file is distributed under the University of Illinois Open Source
64c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner// License. See LICENSE.TXT for details.
74c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner//
84c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner//===----------------------------------------------------------------------===//
94c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner//
104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner// Statement/expression deserialization.  This implements the
11c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl// ASTReader::ReadStmt method.
124c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner//
134c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner//===----------------------------------------------------------------------===//
144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
156ab7cd853e9c15cf986a8a7c3db1f8d20e275409Sebastian Redl#include "clang/Serialization/ASTReader.h"
1639da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor#include "clang/AST/DeclCXX.h"
174c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner#include "clang/AST/StmtVisitor.h"
184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattnerusing namespace clang;
198538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlusing namespace clang::serialization;
204c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
2137bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidisnamespace clang {
2217cfdeda476aa8899f0ccedd9cb9cdb76e89b6b4Argyrios Kyrtzidis
2360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl  class ASTStmtReader : public StmtVisitor<ASTStmtReader> {
24c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl    ASTReader &Reader;
25577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    llvm::BitstreamCursor &DeclsCursor;
26c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl    const ASTReader::RecordData &Record;
274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    unsigned &Idx;
284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  public:
3060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl    ASTStmtReader(ASTReader &Reader, llvm::BitstreamCursor &Cursor,
31c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl                  const ASTReader::RecordData &Record, unsigned &Idx)
32577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl      : Reader(Reader), DeclsCursor(Cursor), Record(Record), Idx(Idx) { }
334c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    /// \brief The number of record fields required for the Stmt class
354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    /// itself.
364c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    static const unsigned NumStmtFields = 0;
374c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
384c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    /// \brief The number of record fields required for the Expr class
394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    /// itself.
404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    static const unsigned NumExprFields = NumStmtFields + 3;
4136c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis
4236c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis    /// \brief Read and initialize a ExplicitTemplateArgumentList structure.
43919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void ReadExplicitTemplateArgumentList(ExplicitTemplateArgumentList &ArgList,
44919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis                                          unsigned NumTemplateArgs);
45919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
46919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitStmt(Stmt *S);
47919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitNullStmt(NullStmt *S);
48919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCompoundStmt(CompoundStmt *S);
49919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitSwitchCase(SwitchCase *S);
50919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCaseStmt(CaseStmt *S);
51919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitDefaultStmt(DefaultStmt *S);
52919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitLabelStmt(LabelStmt *S);
53919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitIfStmt(IfStmt *S);
54919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitSwitchStmt(SwitchStmt *S);
55919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitWhileStmt(WhileStmt *S);
56919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitDoStmt(DoStmt *S);
57919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitForStmt(ForStmt *S);
58919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitGotoStmt(GotoStmt *S);
59919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitIndirectGotoStmt(IndirectGotoStmt *S);
60919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitContinueStmt(ContinueStmt *S);
61919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitBreakStmt(BreakStmt *S);
62919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitReturnStmt(ReturnStmt *S);
63919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitDeclStmt(DeclStmt *S);
64919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitAsmStmt(AsmStmt *S);
65919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitExpr(Expr *E);
66919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitPredefinedExpr(PredefinedExpr *E);
67919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitDeclRefExpr(DeclRefExpr *E);
68919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitIntegerLiteral(IntegerLiteral *E);
69919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitFloatingLiteral(FloatingLiteral *E);
70919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitImaginaryLiteral(ImaginaryLiteral *E);
71919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitStringLiteral(StringLiteral *E);
72919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCharacterLiteral(CharacterLiteral *E);
73919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitParenExpr(ParenExpr *E);
7437bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis    void VisitParenListExpr(ParenListExpr *E);
75919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitUnaryOperator(UnaryOperator *E);
76919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitOffsetOfExpr(OffsetOfExpr *E);
77919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E);
78919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitArraySubscriptExpr(ArraySubscriptExpr *E);
79919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCallExpr(CallExpr *E);
80919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitMemberExpr(MemberExpr *E);
81919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCastExpr(CastExpr *E);
82919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitBinaryOperator(BinaryOperator *E);
83919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCompoundAssignOperator(CompoundAssignOperator *E);
84919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitConditionalOperator(ConditionalOperator *E);
85919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitImplicitCastExpr(ImplicitCastExpr *E);
86919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitExplicitCastExpr(ExplicitCastExpr *E);
87919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCStyleCastExpr(CStyleCastExpr *E);
88919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
89919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitExtVectorElementExpr(ExtVectorElementExpr *E);
90919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitInitListExpr(InitListExpr *E);
91919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitDesignatedInitExpr(DesignatedInitExpr *E);
92919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitImplicitValueInitExpr(ImplicitValueInitExpr *E);
93919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitVAArgExpr(VAArgExpr *E);
94919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitAddrLabelExpr(AddrLabelExpr *E);
95919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitStmtExpr(StmtExpr *E);
96919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitTypesCompatibleExpr(TypesCompatibleExpr *E);
97919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitChooseExpr(ChooseExpr *E);
98919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitGNUNullExpr(GNUNullExpr *E);
99919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitShuffleVectorExpr(ShuffleVectorExpr *E);
100919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitBlockExpr(BlockExpr *E);
101919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitBlockDeclRefExpr(BlockDeclRefExpr *E);
102919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitObjCStringLiteral(ObjCStringLiteral *E);
103919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitObjCEncodeExpr(ObjCEncodeExpr *E);
104919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitObjCSelectorExpr(ObjCSelectorExpr *E);
105919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitObjCProtocolExpr(ObjCProtocolExpr *E);
106919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitObjCIvarRefExpr(ObjCIvarRefExpr *E);
107919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E);
108919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitObjCImplicitSetterGetterRefExpr(
10909105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian                            ObjCImplicitSetterGetterRefExpr *E);
110919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitObjCMessageExpr(ObjCMessageExpr *E);
111919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitObjCSuperExpr(ObjCSuperExpr *E);
112919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitObjCIsaExpr(ObjCIsaExpr *E);
113919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
114919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitObjCForCollectionStmt(ObjCForCollectionStmt *);
115919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitObjCAtCatchStmt(ObjCAtCatchStmt *);
116919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *);
117919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitObjCAtTryStmt(ObjCAtTryStmt *);
118919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *);
119919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitObjCAtThrowStmt(ObjCAtThrowStmt *);
120919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
1217cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis    // C++ Statements
1227cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis    void VisitCXXCatchStmt(CXXCatchStmt *S);
1237cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis    void VisitCXXTryStmt(CXXTryStmt *S);
1247cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis
125919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E);
126919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCXXConstructExpr(CXXConstructExpr *E);
1276d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis    void VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E);
128919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCXXNamedCastExpr(CXXNamedCastExpr *E);
129919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCXXStaticCastExpr(CXXStaticCastExpr *E);
130919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E);
131919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E);
132919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCXXConstCastExpr(CXXConstCastExpr *E);
133919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E);
134919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E);
135919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E);
136919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCXXTypeidExpr(CXXTypeidExpr *E);
13701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    void VisitCXXUuidofExpr(CXXUuidofExpr *E);
138919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCXXThisExpr(CXXThisExpr *E);
139919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCXXThrowExpr(CXXThrowExpr *E);
140919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E);
141919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E);
142d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner
143ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor    void VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E);
144919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCXXNewExpr(CXXNewExpr *E);
145919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCXXDeleteExpr(CXXDeleteExpr *E);
146919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E);
1475921863d8f24084797863b5df37842113bac4352Chris Lattner
148919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E);
1498dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
150919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E);
151919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E);
152919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E);
153a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
154919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitOverloadExpr(OverloadExpr *E);
155919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E);
156919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E);
1576d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis
1586d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis    void VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E);
1596b219d082434394c1ac401390ec1d1967727815aSebastian Redl    void VisitCXXNoexceptExpr(CXXNoexceptExpr *E);
1604c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  };
1614c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
1624c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
16360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::
16436c76f0bea0d3595a25a5362225c642019cc3176Argyrios KyrtzidisReadExplicitTemplateArgumentList(ExplicitTemplateArgumentList &ArgList,
165919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis                                 unsigned NumTemplateArgs) {
16636c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis  TemplateArgumentListInfo ArgInfo;
16736c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis  ArgInfo.setLAngleLoc(Reader.ReadSourceLocation(Record, Idx));
16836c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis  ArgInfo.setRAngleLoc(Reader.ReadSourceLocation(Record, Idx));
16936c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis  for (unsigned i = 0; i != NumTemplateArgs; ++i)
170577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    ArgInfo.addArgument(
171577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl        Reader.ReadTemplateArgumentLoc(DeclsCursor, Record, Idx));
17236c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis  ArgList.initializeFrom(ArgInfo);
17336c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis}
17436c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis
17560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitStmt(Stmt *S) {
1764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  assert(Idx == NumStmtFields && "Incorrect statement field count");
1774c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
1784c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
17960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitNullStmt(NullStmt *S) {
1804c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
1814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setSemiLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
1824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
1834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
18460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCompoundStmt(CompoundStmt *S) {
1854c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
186919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  llvm::SmallVector<Stmt *, 16> Stmts;
1874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned NumStmts = Record[Idx++];
188919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  while (NumStmts--)
189d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    Stmts.push_back(Reader.ReadSubStmt());
190919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  S->setStmts(*Reader.getContext(), Stmts.data(), Stmts.size());
1914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setLBracLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
1924c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setRBracLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
1934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
1944c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
19560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitSwitchCase(SwitchCase *S) {
1964c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
1974c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  Reader.RecordSwitchCaseID(S, Record[Idx++]);
1984c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
1994c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
20060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCaseStmt(CaseStmt *S) {
2014c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitSwitchCase(S);
202d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setLHS(Reader.ReadSubExpr());
203d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setRHS(Reader.ReadSubExpr());
204d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setSubStmt(Reader.ReadSubStmt());
2054c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setCaseLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
206dbb26db1d426fb6caaaf1b4fa47b46d1947c12c9Douglas Gregor  S->setEllipsisLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
207dbb26db1d426fb6caaaf1b4fa47b46d1947c12c9Douglas Gregor  S->setColonLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2084c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2094c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
21060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitDefaultStmt(DefaultStmt *S) {
2114c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitSwitchCase(S);
212d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setSubStmt(Reader.ReadSubStmt());
2134c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setDefaultLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
214dbb26db1d426fb6caaaf1b4fa47b46d1947c12c9Douglas Gregor  S->setColonLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2154c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2164c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
21760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitLabelStmt(LabelStmt *S) {
2184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
2194c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setID(Reader.GetIdentifierInfo(Record, Idx));
220d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setSubStmt(Reader.ReadSubStmt());
2214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setIdentLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2224c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  Reader.RecordLabelStmt(S, Record[Idx++]);
2234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
22560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitIfStmt(IfStmt *S) {
2264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
22743dec6bbde2d0a16c35978983761c8b7030c8e18Douglas Gregor  S->setConditionVariable(*Reader.getContext(),
22843dec6bbde2d0a16c35978983761c8b7030c8e18Douglas Gregor                          cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
229d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCond(Reader.ReadSubExpr());
230d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setThen(Reader.ReadSubStmt());
231d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setElse(Reader.ReadSubStmt());
2324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setIfLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
233d06f6ca61062f85926eb9d409eb3d4f8afcf93c7Douglas Gregor  S->setElseLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
23660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitSwitchStmt(SwitchStmt *S) {
2374c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
23843dec6bbde2d0a16c35978983761c8b7030c8e18Douglas Gregor  S->setConditionVariable(*Reader.getContext(),
23943dec6bbde2d0a16c35978983761c8b7030c8e18Douglas Gregor                          cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
240d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCond(Reader.ReadSubExpr());
241d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setBody(Reader.ReadSubStmt());
2424c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setSwitchLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
243559fb554602bedb57dbbf3cc14ac8a38264b4547Ted Kremenek  if (Record[Idx++])
244559fb554602bedb57dbbf3cc14ac8a38264b4547Ted Kremenek    S->setAllEnumCasesCovered();
245559fb554602bedb57dbbf3cc14ac8a38264b4547Ted Kremenek
2464c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  SwitchCase *PrevSC = 0;
2474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned N = Record.size(); Idx != N; ++Idx) {
2484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    SwitchCase *SC = Reader.getSwitchCaseWithID(Record[Idx]);
2494c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    if (PrevSC)
2504c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      PrevSC->setNextSwitchCase(SC);
2514c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    else
2524c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S->setSwitchCaseList(SC);
2531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
25443d9d9243329b1b75d1a6efdad9f16d6fb386b8eDouglas Gregor    // Retain this SwitchCase, since SwitchStmt::addSwitchCase() would
25543d9d9243329b1b75d1a6efdad9f16d6fb386b8eDouglas Gregor    // normally retain it (but we aren't calling addSwitchCase).
25643d9d9243329b1b75d1a6efdad9f16d6fb386b8eDouglas Gregor    SC->Retain();
2574c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    PrevSC = SC;
2584c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
2594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2604c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
26160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitWhileStmt(WhileStmt *S) {
2624c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
26343dec6bbde2d0a16c35978983761c8b7030c8e18Douglas Gregor  S->setConditionVariable(*Reader.getContext(),
26443dec6bbde2d0a16c35978983761c8b7030c8e18Douglas Gregor                          cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
265d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCond(Reader.ReadSubExpr());
266d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setBody(Reader.ReadSubStmt());
2674c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setWhileLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2684c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2694c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
27060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitDoStmt(DoStmt *S) {
2714c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
272d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCond(Reader.ReadSubExpr());
273d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setBody(Reader.ReadSubStmt());
2744c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setDoLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2759f3ca2a7747bd47f14d7693f333103fac29a24d2Douglas Gregor  S->setWhileLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
276989135901c750af61ef012b6b0a0368be415bc46Chris Lattner  S->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2774c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2784c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
27960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitForStmt(ForStmt *S) {
2804c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
281d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setInit(Reader.ReadSubStmt());
282d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCond(Reader.ReadSubExpr());
28343dec6bbde2d0a16c35978983761c8b7030c8e18Douglas Gregor  S->setConditionVariable(*Reader.getContext(),
28443dec6bbde2d0a16c35978983761c8b7030c8e18Douglas Gregor                          cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
285d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setInc(Reader.ReadSubExpr());
286d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setBody(Reader.ReadSubStmt());
2874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setForLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2885831c6a1efc47e6a19d82fe3dd25b5b8fef6979dDouglas Gregor  S->setLParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2895831c6a1efc47e6a19d82fe3dd25b5b8fef6979dDouglas Gregor  S->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2904c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
29260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitGotoStmt(GotoStmt *S) {
2934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
2944c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  Reader.SetLabelOf(S, Record[Idx++]);
2954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setGotoLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2964c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setLabelLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2974c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2984c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
29960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
3004c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
3014c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setGotoLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
3025f1b9e689fa5c101512aef99225f2afea1673449Douglas Gregor  S->setStarLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
303d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setTarget(Reader.ReadSubExpr());
3044c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3054c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
30660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitContinueStmt(ContinueStmt *S) {
3074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
3084c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setContinueLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
3094c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
31160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitBreakStmt(BreakStmt *S) {
3124c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
3134c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setBreakLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
3144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3154c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
31660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitReturnStmt(ReturnStmt *S) {
3174c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
318d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setRetValue(Reader.ReadSubExpr());
3194c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setReturnLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
3205077c3876beeaed32280af88244e8050078619a8Douglas Gregor  S->setNRVOCandidate(cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
3214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3224c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
32360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitDeclStmt(DeclStmt *S) {
3244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
3254c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setStartLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
3264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setEndLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
3274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
3284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  if (Idx + 1 == Record.size()) {
3294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    // Single declaration
3304c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    S->setDeclGroup(DeclGroupRef(Reader.GetDecl(Record[Idx++])));
3314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  } else {
3324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    llvm::SmallVector<Decl *, 16> Decls;
3334c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    Decls.reserve(Record.size() - Idx);
3344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    for (unsigned N = Record.size(); Idx != N; ++Idx)
3354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      Decls.push_back(Reader.GetDecl(Record[Idx]));
336d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    S->setDeclGroup(DeclGroupRef(DeclGroup::Create(*Reader.getContext(),
33775fdb2377604e53678102076991bea345ace4692Douglas Gregor                                                   Decls.data(),
33875fdb2377604e53678102076991bea345ace4692Douglas Gregor                                                   Decls.size())));
3394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
3404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3414c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
34260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitAsmStmt(AsmStmt *S) {
3434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
3444c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned NumOutputs = Record[Idx++];
3454c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned NumInputs = Record[Idx++];
3464c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned NumClobbers = Record[Idx++];
3474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setAsmLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
3484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
3494c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setVolatile(Record[Idx++]);
3504c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setSimple(Record[Idx++]);
3513b11fd3b52e7b88233c602407c151d07cb093e75Mike Stump  S->setMSAsm(Record[Idx++]);
3521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
353d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setAsmString(cast_or_null<StringLiteral>(Reader.ReadSubStmt()));
3544c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
3554c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  // Outputs and inputs
356ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson  llvm::SmallVector<IdentifierInfo *, 16> Names;
3574c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  llvm::SmallVector<StringLiteral*, 16> Constraints;
3584c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  llvm::SmallVector<Stmt*, 16> Exprs;
3594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0, N = NumOutputs + NumInputs; I != N; ++I) {
360ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson    Names.push_back(Reader.GetIdentifierInfo(Record, Idx));
361d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    Constraints.push_back(cast_or_null<StringLiteral>(Reader.ReadSubStmt()));
362d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    Exprs.push_back(Reader.ReadSubStmt());
3634c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
3644c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
3654c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  // Constraints
3664c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  llvm::SmallVector<StringLiteral*, 16> Clobbers;
3674c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0; I != NumClobbers; ++I)
368d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    Clobbers.push_back(cast_or_null<StringLiteral>(Reader.ReadSubStmt()));
369fdba9c069023f686e2608affde02c82131ee1cf8Anders Carlsson
370acb6bcb442936f3c14126fdd473307c17647cb84Anders Carlsson  S->setOutputsAndInputsAndClobbers(*Reader.getContext(),
371acb6bcb442936f3c14126fdd473307c17647cb84Anders Carlsson                                    Names.data(), Constraints.data(),
372fdba9c069023f686e2608affde02c82131ee1cf8Anders Carlsson                                    Exprs.data(), NumOutputs, NumInputs,
373fdba9c069023f686e2608affde02c82131ee1cf8Anders Carlsson                                    Clobbers.data(), NumClobbers);
3744c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3754c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
37660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitExpr(Expr *E) {
3774c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(E);
3784c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setType(Reader.GetType(Record[Idx++]));
3794c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setTypeDependent(Record[Idx++]);
3804c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setValueDependent(Record[Idx++]);
3814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  assert(Idx == NumExprFields && "Incorrect expression field count");
3824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
38460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitPredefinedExpr(PredefinedExpr *E) {
3854c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
3864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
3874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setIdentType((PredefinedExpr::IdentType)Record[Idx++]);
3884c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
39060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitDeclRefExpr(DeclRefExpr *E) {
3914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
392663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
393663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  bool HasQualifier = Record[Idx++];
394663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  unsigned NumTemplateArgs = Record[Idx++];
395663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
396663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  E->DecoratedD.setInt((HasQualifier? DeclRefExpr::HasQualifierFlag : 0) |
397663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      (NumTemplateArgs ? DeclRefExpr::HasExplicitTemplateArgumentListFlag : 0));
398663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
399663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  if (HasQualifier) {
400663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis    E->getNameQualifier()->NNS = Reader.ReadNestedNameSpecifier(Record, Idx);
401663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis    E->getNameQualifier()->Range = Reader.ReadSourceRange(Record, Idx);
402663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  }
403663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
404663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  if (NumTemplateArgs)
405096832c5ed5b9106fa177ebc148489760c3bc496John McCall    ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),
406663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis                                     NumTemplateArgs);
407663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
408dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  E->setDecl(cast<ValueDecl>(Reader.GetDecl(Record[Idx++])));
4092577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  // FIXME: read DeclarationNameLoc.
410663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  E->setLocation(Reader.ReadSourceLocation(Record, Idx));
4114c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4124c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
41360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitIntegerLiteral(IntegerLiteral *E) {
4144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
4154c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
4169996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  E->setValue(*Reader.getContext(), Reader.ReadAPInt(Record, Idx));
4174c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
41960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitFloatingLiteral(FloatingLiteral *E) {
4204c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
4219996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  E->setValue(*Reader.getContext(), Reader.ReadAPFloat(Record, Idx));
4224c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setExact(Record[Idx++]);
4234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
4244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4254c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
42660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitImaginaryLiteral(ImaginaryLiteral *E) {
4274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
428d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
4294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4304c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
43160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitStringLiteral(StringLiteral *E) {
4324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
4334c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned Len = Record[Idx++];
4341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  assert(Record[Idx] == E->getNumConcatenated() &&
4354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner         "Wrong number of concatenated tokens!");
4364c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  ++Idx;
4374c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setWide(Record[Idx++]);
4384c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
4391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Read string data
440b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar  llvm::SmallString<16> Str(&Record[Idx], &Record[Idx] + Len);
441b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar  E->setString(*Reader.getContext(), Str.str());
4424c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  Idx += Len;
4434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
4444c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  // Read source locations
4454c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0, N = E->getNumConcatenated(); I != N; ++I)
4464c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    E->setStrTokenLoc(I, SourceLocation::getFromRawEncoding(Record[Idx++]));
4474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
44960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCharacterLiteral(CharacterLiteral *E) {
4504c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
4514c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setValue(Record[Idx++]);
4524c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
4534c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setWide(Record[Idx++]);
4544c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4554c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
45660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitParenExpr(ParenExpr *E) {
4574c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
4584c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLParen(SourceLocation::getFromRawEncoding(Record[Idx++]));
4594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParen(SourceLocation::getFromRawEncoding(Record[Idx++]));
460d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
4614c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4624c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
46360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitParenListExpr(ParenListExpr *E) {
46437bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  VisitExpr(E);
46537bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  unsigned NumExprs = Record[Idx++];
46637bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  E->Exprs = new (*Reader.getContext()) Stmt*[NumExprs];
46737bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  for (unsigned i = 0; i != NumExprs; ++i)
46837bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis    E->Exprs[i] = Reader.ReadSubStmt();
46937bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  E->NumExprs = NumExprs;
47037bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  E->LParenLoc = Reader.ReadSourceLocation(Record, Idx);
47137bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  E->RParenLoc = Reader.ReadSourceLocation(Record, Idx);
47237bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis}
47337bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis
47460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitUnaryOperator(UnaryOperator *E) {
4754c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
476d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
4774c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setOpcode((UnaryOperator::Opcode)Record[Idx++]);
4784c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setOperatorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
4794c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4804c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
48160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitOffsetOfExpr(OffsetOfExpr *E) {
4828ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  typedef OffsetOfExpr::OffsetOfNode Node;
4838ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  VisitExpr(E);
4848ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  assert(E->getNumComponents() == Record[Idx]);
4858ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  ++Idx;
4868ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  assert(E->getNumExpressions() == Record[Idx]);
4878ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  ++Idx;
4888ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  E->setOperatorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
4898ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
490577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  E->setTypeSourceInfo(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
4918ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
4928ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Node::Kind Kind = static_cast<Node::Kind>(Record[Idx++]);
4938ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    SourceLocation Start = SourceLocation::getFromRawEncoding(Record[Idx++]);
4948ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    SourceLocation End = SourceLocation::getFromRawEncoding(Record[Idx++]);
4958ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    switch (Kind) {
4968ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Array:
4978ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      E->setComponent(I, Node(Start, Record[Idx++], End));
4988ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
4998ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
5008ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Field:
5018ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      E->setComponent(I,
5028ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor             Node(Start,
5038ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                  dyn_cast_or_null<FieldDecl>(Reader.GetDecl(Record[Idx++])),
5048ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                  End));
5058ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
5068ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
5078ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Identifier:
5088ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      E->setComponent(I, Node(Start, Reader.GetIdentifier(Record[Idx++]), End));
5098ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
510cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor
511afbf3127cbdebc7d3d8711c51b1d013afa57e849Argyrios Kyrtzidis    case Node::Base: {
512afbf3127cbdebc7d3d8711c51b1d013afa57e849Argyrios Kyrtzidis      CXXBaseSpecifier *Base = new (*Reader.getContext()) CXXBaseSpecifier();
513afbf3127cbdebc7d3d8711c51b1d013afa57e849Argyrios Kyrtzidis      *Base = Reader.ReadCXXBaseSpecifier(DeclsCursor, Record, Idx);
514afbf3127cbdebc7d3d8711c51b1d013afa57e849Argyrios Kyrtzidis      E->setComponent(I, Node(Base));
515cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      break;
5168ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
517afbf3127cbdebc7d3d8711c51b1d013afa57e849Argyrios Kyrtzidis    }
5188ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
5198ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
5208ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I)
521d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setIndexExpr(I, Reader.ReadSubExpr());
5228ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
5238ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
52460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
5254c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
5264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setSizeof(Record[Idx++]);
5274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  if (Record[Idx] == 0) {
528d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setArgument(Reader.ReadSubExpr());
5294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    ++Idx;
5304c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  } else {
531577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    E->setArgument(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
5324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
5334c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setOperatorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
5344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
5354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5364c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
53760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
5384c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
539d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setLHS(Reader.ReadSubExpr());
540d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setRHS(Reader.ReadSubExpr());
5414c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRBracketLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
5424c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
54460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCallExpr(CallExpr *E) {
5454c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
546d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner  E->setNumArgs(*Reader.getContext(), Record[Idx++]);
5474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
548d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setCallee(Reader.ReadSubExpr());
5494c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
550d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setArg(I, Reader.ReadSubExpr());
5514c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5524c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
55360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitMemberExpr(MemberExpr *E) {
554663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  // Don't call VisitExpr, this is fully initialized at creation.
555663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  assert(E->getStmtClass() == Stmt::MemberExprClass &&
556663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis         "It's a subclass, we must advance Idx!");
5574c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5584c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
55960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCIsaExpr(ObjCIsaExpr *E) {
560f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff  VisitExpr(E);
561d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
562f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff  E->setIsaMemberLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
563f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff  E->setArrow(Record[Idx++]);
564f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff}
565f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff
56660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCastExpr(CastExpr *E) {
5674c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
568f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  unsigned NumBaseSpecs = Record[Idx++];
569f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  assert(NumBaseSpecs == E->path_size());
570d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
571cdef2b75aa60cde1ca00e0aa3f89139ac89c6ae4Anders Carlsson  E->setCastKind((CastExpr::CastKind)Record[Idx++]);
572f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  CastExpr::path_iterator BaseI = E->path_begin();
5730745d0a648b75bd304045309276c70a755adaafbArgyrios Kyrtzidis  while (NumBaseSpecs--) {
5740745d0a648b75bd304045309276c70a755adaafbArgyrios Kyrtzidis    CXXBaseSpecifier *BaseSpec = new (*Reader.getContext()) CXXBaseSpecifier;
5755606220447c7901ba8d80147ddab893bb7949dd5Nick Lewycky    *BaseSpec = Reader.ReadCXXBaseSpecifier(DeclsCursor, Record, Idx);
576f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    *BaseI++ = BaseSpec;
5770745d0a648b75bd304045309276c70a755adaafbArgyrios Kyrtzidis  }
5784c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5794c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
58060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitBinaryOperator(BinaryOperator *E) {
5814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
582d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setLHS(Reader.ReadSubExpr());
583d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setRHS(Reader.ReadSubExpr());
5844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setOpcode((BinaryOperator::Opcode)Record[Idx++]);
5854c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setOperatorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
5864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
58860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
5894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitBinaryOperator(E);
5904c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setComputationLHSType(Reader.GetType(Record[Idx++]));
5914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setComputationResultType(Reader.GetType(Record[Idx++]));
5924c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
59460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitConditionalOperator(ConditionalOperator *E) {
5954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
596d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setCond(Reader.ReadSubExpr());
597d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setLHS(Reader.ReadSubExpr());
598d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setRHS(Reader.ReadSubExpr());
599f9b949fecf339a2c9bd97dd11a272c4878f85ce4Fariborz Jahanian  E->setSAVE(Reader.ReadSubExpr());
60047e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor  E->setQuestionLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
60147e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor  E->setColonLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
6024c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
6034c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
60460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitImplicitCastExpr(ImplicitCastExpr *E) {
6054c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitCastExpr(E);
6065baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall  E->setValueKind(static_cast<ExprValueKind>(Record[Idx++]));
6074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
6084c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
60960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitExplicitCastExpr(ExplicitCastExpr *E) {
6104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitCastExpr(E);
611577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  E->setTypeInfoAsWritten(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
6124c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
6134c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
61460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCStyleCastExpr(CStyleCastExpr *E) {
6154c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExplicitCastExpr(E);
6164c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
6174c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
6184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
6194c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
62060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
6214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
6224c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
623577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  E->setTypeSourceInfo(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
624d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setInitializer(Reader.ReadSubExpr());
6254c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setFileScope(Record[Idx++]);
6264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
6274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
62860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
6294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
630d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
6314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setAccessor(Reader.GetIdentifierInfo(Record, Idx));
6324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setAccessorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
6334c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
6344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
63560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitInitListExpr(InitListExpr *E) {
6364c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
6374c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned NumInits = Record[Idx++];
638709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek  E->reserveInits(*Reader.getContext(), NumInits);
6394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0; I != NumInits; ++I)
640d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->updateInit(*Reader.getContext(), I, Reader.ReadSubExpr());
641d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSyntacticForm(cast_or_null<InitListExpr>(Reader.ReadSubStmt()));
6424c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLBraceLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
6434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRBraceLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
6444c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setInitializedFieldInUnion(
6454c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner                      cast_or_null<FieldDecl>(Reader.GetDecl(Record[Idx++])));
6464c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->sawArrayRangeDesignator(Record[Idx++]);
6474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
6484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
64960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
6504c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  typedef DesignatedInitExpr::Designator Designator;
6514c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
6524c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
6534c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned NumSubExprs = Record[Idx++];
6544c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  assert(NumSubExprs == E->getNumSubExprs() && "Wrong number of subexprs");
6554c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0; I != NumSubExprs; ++I)
656d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setSubExpr(I, Reader.ReadSubExpr());
6574c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setEqualOrColonLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
6584c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setGNUSyntax(Record[Idx++]);
6594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
6604c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  llvm::SmallVector<Designator, 4> Designators;
6614c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  while (Idx < Record.size()) {
6628538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    switch ((DesignatorTypes)Record[Idx++]) {
6638538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case DESIG_FIELD_DECL: {
6644c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      FieldDecl *Field = cast<FieldDecl>(Reader.GetDecl(Record[Idx++]));
6651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      SourceLocation DotLoc
6664c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        = SourceLocation::getFromRawEncoding(Record[Idx++]);
6671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      SourceLocation FieldLoc
6684c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        = SourceLocation::getFromRawEncoding(Record[Idx++]);
6691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Designators.push_back(Designator(Field->getIdentifier(), DotLoc,
6704c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner                                       FieldLoc));
6714c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      Designators.back().setField(Field);
6724c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
6734c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
6744c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
6758538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case DESIG_FIELD_NAME: {
6764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      const IdentifierInfo *Name = Reader.GetIdentifierInfo(Record, Idx);
6771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      SourceLocation DotLoc
6784c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        = SourceLocation::getFromRawEncoding(Record[Idx++]);
6791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      SourceLocation FieldLoc
6804c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        = SourceLocation::getFromRawEncoding(Record[Idx++]);
6814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      Designators.push_back(Designator(Name, DotLoc, FieldLoc));
6824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
6834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
6841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6858538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case DESIG_ARRAY: {
6864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      unsigned Index = Record[Idx++];
6874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      SourceLocation LBracketLoc
6884c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        = SourceLocation::getFromRawEncoding(Record[Idx++]);
6894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      SourceLocation RBracketLoc
6904c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        = SourceLocation::getFromRawEncoding(Record[Idx++]);
6914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      Designators.push_back(Designator(Index, LBracketLoc, RBracketLoc));
6924c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
6934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
6944c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
6958538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case DESIG_ARRAY_RANGE: {
6964c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      unsigned Index = Record[Idx++];
6974c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      SourceLocation LBracketLoc
6984c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        = SourceLocation::getFromRawEncoding(Record[Idx++]);
6994c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      SourceLocation EllipsisLoc
7004c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        = SourceLocation::getFromRawEncoding(Record[Idx++]);
7014c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      SourceLocation RBracketLoc
7024c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        = SourceLocation::getFromRawEncoding(Record[Idx++]);
7034c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      Designators.push_back(Designator(Index, LBracketLoc, EllipsisLoc,
7044c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner                                       RBracketLoc));
7054c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
7064c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
7074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
7084c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
709319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor  E->setDesignators(*Reader.getContext(),
710319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor                    Designators.data(), Designators.size());
7114c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7124c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
71360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
7144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
7154c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7164c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
71760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitVAArgExpr(VAArgExpr *E) {
7184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
719d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
7202cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara  E->setWrittenTypeInfo(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
7214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setBuiltinLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7224c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
72560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitAddrLabelExpr(AddrLabelExpr *E) {
7264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
7274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setAmpAmpLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLabelLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  Reader.SetLabelOf(E, Record[Idx++]);
7304c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
73260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitStmtExpr(StmtExpr *E) {
7334c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
7344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
736d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubStmt(cast_or_null<CompoundStmt>(Reader.ReadSubStmt()));
7374c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7384c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
73960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) {
7404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
7413fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara  E->setArgTInfo1(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
7423fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara  E->setArgTInfo2(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
7434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setBuiltinLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7444c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7454c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7464c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
74760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitChooseExpr(ChooseExpr *E) {
7484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
749d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setCond(Reader.ReadSubExpr());
750d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setLHS(Reader.ReadSubExpr());
751d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setRHS(Reader.ReadSubExpr());
7524c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setBuiltinLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7534c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7544c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7554c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
75660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitGNUNullExpr(GNUNullExpr *E) {
7574c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
7584c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setTokenLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
7594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7604c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
76160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
7624c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
763919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  llvm::SmallVector<Expr *, 16> Exprs;
7644c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned NumExprs = Record[Idx++];
765919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  while (NumExprs--)
766d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    Exprs.push_back(Reader.ReadSubExpr());
767919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  E->setExprs(*Reader.getContext(), Exprs.data(), Exprs.size());
7684c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setBuiltinLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7694c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7704c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7714c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
77260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitBlockExpr(BlockExpr *E) {
7734c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
7744c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setBlockDecl(cast_or_null<BlockDecl>(Reader.GetDecl(Record[Idx++])));
7754c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setHasBlockDeclRefExprs(Record[Idx++]);
7764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7774c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
77860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitBlockDeclRefExpr(BlockDeclRefExpr *E) {
7794c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
7804c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setDecl(cast<ValueDecl>(Reader.GetDecl(Record[Idx++])));
7814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
7824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setByRef(Record[Idx++]);
7839b0b57c6f9996bfdb67248f6942dd23acfa36167Fariborz Jahanian  E->setConstQualAdded(Record[Idx++]);
784d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setCopyConstructorExpr(Reader.ReadSubExpr());
7854c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
7874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner//===----------------------------------------------------------------------===//
7884c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner// Objective-C Expressions and Statements
7894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
79060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCStringLiteral(ObjCStringLiteral *E) {
7914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
792d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setString(cast<StringLiteral>(Reader.ReadSubStmt()));
7934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setAtLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7944c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
79660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
7974c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
798577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  E->setEncodedTypeSourceInfo(Reader.GetTypeSourceInfo(DeclsCursor,Record,Idx));
7994c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setAtLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
8004c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
8014c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8024c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
80360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
8044c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
8054c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setSelector(Reader.GetSelector(Record, Idx));
8064c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setAtLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
8074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
8084c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8094c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
81060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
8114c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
8124c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setProtocol(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++])));
8134c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setAtLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
8144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
8154c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8164c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
81760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
8184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
8194c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setDecl(cast<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++])));
8204c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
821d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
8224c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setIsArrow(Record[Idx++]);
8234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setIsFreeIvar(Record[Idx++]);
8244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8254c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
82660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
8274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
8284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setProperty(cast<ObjCPropertyDecl>(Reader.GetDecl(Record[Idx++])));
8294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
830d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
8314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
83360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCImplicitSetterGetterRefExpr(
83409105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian                                      ObjCImplicitSetterGetterRefExpr *E) {
8354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
8364c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setGetterMethod(
8374c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner                 cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++])));
8384c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setSetterMethod(
8394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner                 cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++])));
840d2ae5aa732e8587816fd7a7be911460e337c178eFariborz Jahanian  E->setInterfaceDecl(
8414c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner              cast_or_null<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])));
842d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
8434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
8444c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setClassLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
8454c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8464c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
84760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCMessageExpr(ObjCMessageExpr *E) {
8484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
84904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  assert(Record[Idx] == E->getNumArgs());
85004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  ++Idx;
85104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  ObjCMessageExpr::ReceiverKind Kind
85204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    = static_cast<ObjCMessageExpr::ReceiverKind>(Record[Idx++]);
85304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  switch (Kind) {
85404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::Instance:
855d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setInstanceReceiver(Reader.ReadSubExpr());
85604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
85704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
85804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::Class:
859577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    E->setClassReceiver(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
86004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
86104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
86204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::SuperClass:
86304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::SuperInstance: {
86404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    QualType T = Reader.GetType(Record[Idx++]);
86504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    SourceLocation SuperLoc = SourceLocation::getFromRawEncoding(Record[Idx++]);
86604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    E->setSuper(SuperLoc, T, Kind == ObjCMessageExpr::SuperInstance);
86704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
86804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  }
8694c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
8704c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
87104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  assert(Kind == E->getReceiverKind());
87204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
87304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  if (Record[Idx++])
87404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    E->setMethodDecl(cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++])));
87504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  else
87604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    E->setSelector(Reader.GetSelector(Record, Idx));
87704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
87804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  E->setLeftLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
87904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  E->setRightLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
88004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
8814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
882d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setArg(I, Reader.ReadSubExpr());
8834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
88560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCSuperExpr(ObjCSuperExpr *E) {
8864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
8874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
8884c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
89060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
8914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
892d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setElement(Reader.ReadSubStmt());
893d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCollection(Reader.ReadSubExpr());
894d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setBody(Reader.ReadSubStmt());
8954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setForLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
8964c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
8974c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8984c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
89960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
9004c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
901d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCatchBody(Reader.ReadSubStmt());
902c00d8e18ad3d903acfeb5d05163ce90713066a3fDouglas Gregor  S->setCatchParamDecl(cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
9034c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setAtCatchLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
9044c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
9054c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
9064c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
90760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
9084c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
909d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setFinallyBody(Reader.ReadSubStmt());
9104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setAtFinallyLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
9114c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
9124c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
91360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
9144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
9158f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  assert(Record[Idx] == S->getNumCatchStmts());
9168f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  ++Idx;
9178f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  bool HasFinally = Record[Idx++];
918d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setTryBody(Reader.ReadSubStmt());
919919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I)
920d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    S->setCatchStmt(I, cast_or_null<ObjCAtCatchStmt>(Reader.ReadSubStmt()));
9218f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor
9228f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  if (HasFinally)
923d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    S->setFinallyStmt(Reader.ReadSubStmt());
9244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setAtTryLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
9254c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
9264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
92760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {
9284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
929d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setSynchExpr(Reader.ReadSubStmt());
930d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setSynchBody(Reader.ReadSubStmt());
9314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setAtSynchronizedLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
9324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
9334c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
93460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
9354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
936d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setThrowExpr(Reader.ReadSubStmt());
9374c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setThrowLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
9384c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
9394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
940ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
941ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis// C++ Expressions and Statements
9427cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
9437cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis
94460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXCatchStmt(CXXCatchStmt *S) {
9457cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  VisitStmt(S);
9467cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  S->CatchLoc = Reader.ReadSourceLocation(Record, Idx);
9477cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  S->ExceptionDecl = cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++]));
9487cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  S->HandlerBlock = Reader.ReadSubStmt();
9497cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis}
9507cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis
95160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXTryStmt(CXXTryStmt *S) {
9527cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  VisitStmt(S);
9537cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  assert(Record[Idx] == S->getNumHandlers() && "NumStmtFields is wrong ?");
9547cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  ++Idx;
9557cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  S->TryLoc = Reader.ReadSourceLocation(Record, Idx);
9567cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  S->getStmts()[0] = Reader.ReadSubStmt();
9577cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  for (unsigned i = 0, e = S->getNumHandlers(); i != e; ++i)
9587cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis    S->getStmts()[i + 1] = Reader.ReadSubStmt();
9597cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis}
960ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis
96160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
962919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  VisitCallExpr(E);
963ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis  E->setOperator((OverloadedOperatorKind)Record[Idx++]);
964ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis}
965ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis
96660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXConstructExpr(CXXConstructExpr *E) {
96739da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor  VisitExpr(E);
9686d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  E->NumArgs = Record[Idx++];
9696d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  if (E->NumArgs)
9706d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis    E->Args = new (*Reader.getContext()) Stmt*[E->NumArgs];
9715e1b7c2f419544a88537f7ff4e32ed744ba7b44eArgyrios Kyrtzidis  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
972d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setArg(I, Reader.ReadSubExpr());
97339da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor  E->setConstructor(cast<CXXConstructorDecl>(Reader.GetDecl(Record[Idx++])));
97499a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
97539da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor  E->setElidable(Record[Idx++]);
97616006c901315fa12a108b4e571f187f4b676e426Douglas Gregor  E->setRequiresZeroInitialization(Record[Idx++]);
9773c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor  E->setConstructionKind((CXXConstructExpr::ConstructionKind)Record[Idx++]);
97839da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor}
9794c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
98060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {
9816d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  VisitCXXConstructExpr(E);
982ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  E->Type = Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx);
9836d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  E->RParenLoc = Reader.ReadSourceLocation(Record, Idx);
9846d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis}
9856d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis
98660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
987919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  VisitExplicitCastExpr(E);
988ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig  E->setOperatorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
989ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
990ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
99160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
992ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig  return VisitCXXNamedCastExpr(E);
993ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
994ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
99560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
996ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig  return VisitCXXNamedCastExpr(E);
997ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
998ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
99960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) {
1000ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig  return VisitCXXNamedCastExpr(E);
1001ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
1002ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
100360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
1004ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig  return VisitCXXNamedCastExpr(E);
1005ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
1006ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
100760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {
1008919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  VisitExplicitCastExpr(E);
1009ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig  E->setTypeBeginLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
1010ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
1011ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
1012ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
101360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
1014eb7f96141f754150a92433286fa385910a22f494Sam Weinig  VisitExpr(E);
1015eb7f96141f754150a92433286fa385910a22f494Sam Weinig  E->setValue(Record[Idx++]);
1016eb7f96141f754150a92433286fa385910a22f494Sam Weinig  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
1017eb7f96141f754150a92433286fa385910a22f494Sam Weinig}
1018eb7f96141f754150a92433286fa385910a22f494Sam Weinig
101960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
1020eb7f96141f754150a92433286fa385910a22f494Sam Weinig  VisitExpr(E);
1021eb7f96141f754150a92433286fa385910a22f494Sam Weinig  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
1022eb7f96141f754150a92433286fa385910a22f494Sam Weinig}
1023eb7f96141f754150a92433286fa385910a22f494Sam Weinig
102460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
102514ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner  VisitExpr(E);
102614ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner  E->setSourceRange(Reader.ReadSourceRange(Record, Idx));
102714ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner  if (E->isTypeOperand()) { // typeid(int)
1028577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    E->setTypeOperandSourceInfo(
1029577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl        Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
1030919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    return;
103114ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner  }
103214ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner
103314ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner  // typeid(42+2)
1034d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setExprOperand(Reader.ReadSubExpr());
103514ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner}
103601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichetvoid ASTStmtReader::VisitCXXUuidofExpr(CXXUuidofExpr *E) {
103701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  VisitExpr(E);
103801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  E->setSourceRange(Reader.ReadSourceRange(Record, Idx));
103901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  if (E->isTypeOperand()) { // __uuidof(ComType)
104001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    E->setTypeOperandSourceInfo(
104101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet        Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
104201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    return;
104301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  }
104401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet
104501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  // __uuidof(expr)
104601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  E->setExprOperand(Reader.ReadSubExpr());
104701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet}
104814ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner
104960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXThisExpr(CXXThisExpr *E) {
10502fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner  VisitExpr(E);
10512fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
10522fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner  E->setImplicit(Record[Idx++]);
10532fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner}
10542fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner
105560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXThrowExpr(CXXThrowExpr *E) {
10562fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner  VisitExpr(E);
10572fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner  E->setThrowLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
1058d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
10592fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner}
106014ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner
106160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
1062030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner  VisitExpr(E);
10638a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis
10648a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis  assert(Record[Idx] == E->Param.getInt() && "We messed up at creation ?");
10658a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis  ++Idx; // HasOtherExprStored and SubExpr was handled during creation.
10668a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis  E->Param.setPointer(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++])));
10678a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis  E->Loc = Reader.ReadSourceLocation(Record, Idx);
1068d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner}
1069d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner
107060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
1071d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner  VisitExpr(E);
1072d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner  E->setTemporary(Reader.ReadCXXTemporary(Record, Idx));
1073d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
1074d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner}
1075d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner
107660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
10775921863d8f24084797863b5df37842113bac4352Chris Lattner  VisitExpr(E);
1078ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  E->TypeInfo = Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx);
1079ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  E->RParenLoc = SourceLocation::getFromRawEncoding(Record[Idx++]);
10805921863d8f24084797863b5df37842113bac4352Chris Lattner}
10815921863d8f24084797863b5df37842113bac4352Chris Lattner
108260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXNewExpr(CXXNewExpr *E) {
10835921863d8f24084797863b5df37842113bac4352Chris Lattner  VisitExpr(E);
10845921863d8f24084797863b5df37842113bac4352Chris Lattner  E->setGlobalNew(Record[Idx++]);
10855921863d8f24084797863b5df37842113bac4352Chris Lattner  E->setHasInitializer(Record[Idx++]);
10865921863d8f24084797863b5df37842113bac4352Chris Lattner  bool isArray = Record[Idx++];
10875921863d8f24084797863b5df37842113bac4352Chris Lattner  unsigned NumPlacementArgs = Record[Idx++];
10885921863d8f24084797863b5df37842113bac4352Chris Lattner  unsigned NumCtorArgs = Record[Idx++];
10895921863d8f24084797863b5df37842113bac4352Chris Lattner  E->setOperatorNew(cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++])));
10905921863d8f24084797863b5df37842113bac4352Chris Lattner  E->setOperatorDelete(
10915921863d8f24084797863b5df37842113bac4352Chris Lattner                    cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++])));
10925921863d8f24084797863b5df37842113bac4352Chris Lattner  E->setConstructor(
10935921863d8f24084797863b5df37842113bac4352Chris Lattner               cast_or_null<CXXConstructorDecl>(Reader.GetDecl(Record[Idx++])));
10941bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor  E->AllocatedTypeInfo = Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx);
10954bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor  SourceRange TypeIdParens;
10964bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor  TypeIdParens.setBegin(SourceLocation::getFromRawEncoding(Record[Idx++]));
10974bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor  TypeIdParens.setEnd(SourceLocation::getFromRawEncoding(Record[Idx++]));
10984bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor  E->TypeIdParens = TypeIdParens;
10995921863d8f24084797863b5df37842113bac4352Chris Lattner  E->setStartLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
11005921863d8f24084797863b5df37842113bac4352Chris Lattner  E->setEndLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
11015921863d8f24084797863b5df37842113bac4352Chris Lattner
11025921863d8f24084797863b5df37842113bac4352Chris Lattner  E->AllocateArgsArray(*Reader.getContext(), isArray, NumPlacementArgs,
11035921863d8f24084797863b5df37842113bac4352Chris Lattner                       NumCtorArgs);
11045921863d8f24084797863b5df37842113bac4352Chris Lattner
11055921863d8f24084797863b5df37842113bac4352Chris Lattner  // Install all the subexpressions.
11065921863d8f24084797863b5df37842113bac4352Chris Lattner  for (CXXNewExpr::raw_arg_iterator I = E->raw_arg_begin(),e = E->raw_arg_end();
11075921863d8f24084797863b5df37842113bac4352Chris Lattner       I != e; ++I)
1108d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    *I = Reader.ReadSubStmt();
11095921863d8f24084797863b5df37842113bac4352Chris Lattner}
11105921863d8f24084797863b5df37842113bac4352Chris Lattner
111160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
111295fc98ce95d4faa4f1bb2783384150530404ea6fArgyrios Kyrtzidis  VisitExpr(E);
1113f1b8911d35bb2830a13267581d3cbde4b6b85db6Argyrios Kyrtzidis  E->GlobalDelete = Record[Idx++];
1114f1b8911d35bb2830a13267581d3cbde4b6b85db6Argyrios Kyrtzidis  E->ArrayForm = Record[Idx++];
11154076dacf1497fb95cb298b9d964fbdbdaf9bde6cArgyrios Kyrtzidis  E->ArrayFormAsWritten = Record[Idx++];
1116f1b8911d35bb2830a13267581d3cbde4b6b85db6Argyrios Kyrtzidis  E->OperatorDelete = cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++]));
1117f1b8911d35bb2830a13267581d3cbde4b6b85db6Argyrios Kyrtzidis  E->Argument = Reader.ReadSubExpr();
1118f1b8911d35bb2830a13267581d3cbde4b6b85db6Argyrios Kyrtzidis  E->Loc = Reader.ReadSourceLocation(Record, Idx);
111995fc98ce95d4faa4f1bb2783384150530404ea6fArgyrios Kyrtzidis}
1120d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner
112160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
1122de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  VisitExpr(E);
1123de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis
1124d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
1125de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  E->setArrow(Record[Idx++]);
1126de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  E->setOperatorLoc(Reader.ReadSourceLocation(Record, Idx));
1127de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  E->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx));
1128de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  E->setQualifierRange(Reader.ReadSourceRange(Record, Idx));
1129577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  E->setScopeTypeInfo(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
1130de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  E->setColonColonLoc(Reader.ReadSourceLocation(Record, Idx));
1131de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  E->setTildeLoc(Reader.ReadSourceLocation(Record, Idx));
1132de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis
1133de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  IdentifierInfo *II = Reader.GetIdentifierInfo(Record, Idx);
1134de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  if (II)
1135de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis    E->setDestroyedType(II, Reader.ReadSourceLocation(Record, Idx));
1136de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  else
1137577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    E->setDestroyedType(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
1138de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis}
1139de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis
114060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E) {
1141d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner  VisitExpr(E);
1142d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner  unsigned NumTemps = Record[Idx++];
1143d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner  if (NumTemps) {
1144d04ed416be7c55bddddab1fa3fd38a0113a6b3daTed Kremenek    E->setNumTemporaries(*Reader.getContext(), NumTemps);
1145d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner    for (unsigned i = 0; i != NumTemps; ++i)
1146d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner      E->setTemporary(i, Reader.ReadCXXTemporary(Record, Idx));
1147d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner  }
1148d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
1149030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner}
1150030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner
1151919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidisvoid
115260adf4acf40b72227740bf966fb87eebddff3f37Sebastian RedlASTStmtReader::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){
11538dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  VisitExpr(E);
11548dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
11558dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  unsigned NumTemplateArgs = Record[Idx++];
11568dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  assert((NumTemplateArgs != 0) == E->hasExplicitTemplateArgs() &&
11578dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis         "Read wrong record during creation ?");
115836c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis  if (E->hasExplicitTemplateArgs())
1159096832c5ed5b9106fa177ebc148489760c3bc496John McCall    ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),
1160919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis                                     NumTemplateArgs);
11618dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
1162d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
11638dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setBaseType(Reader.GetType(Record[Idx++]));
11648dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setArrow(Record[Idx++]);
11658dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setOperatorLoc(Reader.ReadSourceLocation(Record, Idx));
11668dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx));
11678dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setQualifierRange(Reader.ReadSourceRange(Record, Idx));
11688dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setFirstQualifierFoundInScope(
11698dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis                        cast_or_null<NamedDecl>(Reader.GetDecl(Record[Idx++])));
11702577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  // FIXME: read whole DeclarationNameInfo.
11718dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setMember(Reader.ReadDeclarationName(Record, Idx));
11728dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setMemberLoc(Reader.ReadSourceLocation(Record, Idx));
11738dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis}
11748dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
1175919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidisvoid
117660adf4acf40b72227740bf966fb87eebddff3f37Sebastian RedlASTStmtReader::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
117712dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis  VisitExpr(E);
117812dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis
117912dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis  unsigned NumTemplateArgs = Record[Idx++];
118012dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis  assert((NumTemplateArgs != 0) == E->hasExplicitTemplateArgs() &&
118112dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis         "Read wrong record during creation ?");
118212dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis  if (E->hasExplicitTemplateArgs())
1183919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),
1184919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis                                     NumTemplateArgs);
118512dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis
11862577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  // FIXME: read whole DeclarationNameInfo.
118712dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis  E->setDeclName(Reader.ReadDeclarationName(Record, Idx));
118812dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis  E->setLocation(Reader.ReadSourceLocation(Record, Idx));
118912dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis  E->setQualifierRange(Reader.ReadSourceRange(Record, Idx));
119012dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis  E->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx));
119112dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis}
119212dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis
1193919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidisvoid
119460adf4acf40b72227740bf966fb87eebddff3f37Sebastian RedlASTStmtReader::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {
11958dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  VisitExpr(E);
11968dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  assert(Record[Idx] == E->arg_size() && "Read wrong record during creation ?");
11978dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  ++Idx; // NumArgs;
11988dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  for (unsigned I = 0, N = E->arg_size(); I != N; ++I)
1199d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setArg(I, Reader.ReadSubExpr());
1200ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  E->Type = Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx);
12018dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setLParenLoc(Reader.ReadSourceLocation(Record, Idx));
12028dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setRParenLoc(Reader.ReadSourceLocation(Record, Idx));
12038dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis}
12048dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
120560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitOverloadExpr(OverloadExpr *E) {
1206a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  VisitExpr(E);
1207a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
1208a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  unsigned NumTemplateArgs = Record[Idx++];
1209a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  assert((NumTemplateArgs != 0) == E->hasExplicitTemplateArgs() &&
1210a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis         "Read wrong record during creation ?");
1211919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  if (E->hasExplicitTemplateArgs())
1212919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),
1213919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis                                     NumTemplateArgs);
1214a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
1215a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  unsigned NumDecls = Record[Idx++];
1216a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  UnresolvedSet<8> Decls;
1217a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  for (unsigned i = 0; i != NumDecls; ++i) {
1218a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis    NamedDecl *D = cast<NamedDecl>(Reader.GetDecl(Record[Idx++]));
1219a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis    AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
1220a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis    Decls.addDecl(D, AS);
1221a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  }
1222a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  E->initializeResults(*Reader.getContext(), Decls.begin(), Decls.end());
1223a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
12242577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  // FIXME: read whole DeclarationNameInfo.
1225a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  E->setName(Reader.ReadDeclarationName(Record, Idx));
1226a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  E->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx));
1227a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  E->setQualifierRange(Reader.ReadSourceRange(Record, Idx));
1228a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  E->setNameLoc(Reader.ReadSourceLocation(Record, Idx));
1229a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis}
1230a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
123160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
1232919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  VisitOverloadExpr(E);
1233a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  E->setArrow(Record[Idx++]);
1234a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  E->setHasUnresolvedUsing(Record[Idx++]);
1235d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
1236a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  E->setBaseType(Reader.GetType(Record[Idx++]));
1237a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  E->setOperatorLoc(Reader.ReadSourceLocation(Record, Idx));
1238a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis}
1239a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
124060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {
1241919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  VisitOverloadExpr(E);
1242bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis  E->setRequiresADL(Record[Idx++]);
1243bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis  E->setOverloaded(Record[Idx++]);
1244bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis  E->setNamingClass(cast_or_null<CXXRecordDecl>(Reader.GetDecl(Record[Idx++])));
1245bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis}
1246bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis
124760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
12486d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  VisitExpr(E);
12496d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  E->UTT = (UnaryTypeTrait)Record[Idx++];
12506d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  SourceRange Range = Reader.ReadSourceRange(Record, Idx);
12516d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  E->Loc = Range.getBegin();
12526d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  E->RParen = Range.getEnd();
12533d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor  E->QueriedType = Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx);
12546d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis}
12556d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis
12566b219d082434394c1ac401390ec1d1967727815aSebastian Redlvoid ASTStmtReader::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
12576b219d082434394c1ac401390ec1d1967727815aSebastian Redl  VisitExpr(E);
12585221d8f2da008689f7ff9476e6522bb2b63ec1a3Sebastian Redl  E->Value = (bool)Record[Idx++];
12595221d8f2da008689f7ff9476e6522bb2b63ec1a3Sebastian Redl  E->Range = Reader.ReadSourceRange(Record, Idx);
12605221d8f2da008689f7ff9476e6522bb2b63ec1a3Sebastian Redl  E->Operand = Reader.ReadSubExpr();
12616b219d082434394c1ac401390ec1d1967727815aSebastian Redl}
12626b219d082434394c1ac401390ec1d1967727815aSebastian Redl
1263c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlStmt *ASTReader::ReadStmt(llvm::BitstreamCursor &Cursor) {
1264919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  switch (ReadingKind) {
1265919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  case Read_Decl:
1266919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  case Read_Type:
1267577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    return ReadStmtFromStream(Cursor);
1268919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  case Read_Stmt:
1269d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    return ReadSubStmt();
1270919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  }
1271919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
1272919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  llvm_unreachable("ReadingKind not set ?");
1273919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  return 0;
1274919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis}
1275919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
1276c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlExpr *ASTReader::ReadExpr(llvm::BitstreamCursor &Cursor) {
1277577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  return cast_or_null<Expr>(ReadStmt(Cursor));
1278919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis}
1279030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner
1280c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlExpr *ASTReader::ReadSubExpr() {
1281d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  return cast_or_null<Expr>(ReadSubStmt());
1282d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis}
1283d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis
128452e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner// Within the bitstream, expressions are stored in Reverse Polish
128552e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner// Notation, with each of the subexpressions preceding the
1286919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis// expression they are stored in. Subexpressions are stored from last to first.
1287919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis// To evaluate expressions, we continue reading expressions and placing them on
1288919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis// the stack, with expressions having operands removing those operands from the
128952e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner// stack. Evaluation terminates when we see a STMT_STOP record, and
129052e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner// the single remaining expression on the stack is our result.
1291c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlStmt *ASTReader::ReadStmtFromStream(llvm::BitstreamCursor &Cursor) {
1292919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
1293919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  ReadingKindTracker ReadingKind(Read_Stmt, *this);
1294919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
1295919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis#ifndef NDEBUG
1296919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  unsigned PrevNumStmts = StmtStack.size();
1297919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis#endif
1298919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
12994c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  RecordData Record;
13004c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned Idx;
130160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl  ASTStmtReader Reader(*this, Cursor, Record, Idx);
13024c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  Stmt::EmptyShell Empty;
13034c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13044c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  while (true) {
130552e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner    unsigned Code = Cursor.ReadCode();
13064c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    if (Code == llvm::bitc::END_BLOCK) {
130752e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner      if (Cursor.ReadBlockEnd()) {
13083c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl        Error("error at end of block in AST file");
13094c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        return 0;
13104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      }
13114c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13124c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
13134c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    if (Code == llvm::bitc::ENTER_SUBBLOCK) {
13154c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      // No known subblocks, always skip them.
131652e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner      Cursor.ReadSubBlockID();
131752e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner      if (Cursor.SkipBlock()) {
13183c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl        Error("malformed block record in AST file");
13194c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        return 0;
13204c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      }
13214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      continue;
13224c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
13234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    if (Code == llvm::bitc::DEFINE_ABBREV) {
132552e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner      Cursor.ReadAbbrevRecord();
13264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      continue;
13274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
13284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    Stmt *S = 0;
13304c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    Idx = 0;
13314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    Record.clear();
13324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    bool Finished = false;
13338538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    switch ((StmtCode)Cursor.ReadRecord(Code, Record)) {
13348538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_STOP:
13354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      Finished = true;
13364c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13374c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13388538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_NULL_PTR:
13391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      S = 0;
13404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13414c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13428538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_NULL:
13434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) NullStmt(Empty);
13444c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13454c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13468538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_COMPOUND:
13474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) CompoundStmt(Empty);
13484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13494c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13508538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_CASE:
13514c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) CaseStmt(Empty);
13524c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13534c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13548538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_DEFAULT:
13554c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) DefaultStmt(Empty);
13564c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13574c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13588538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_LABEL:
13594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) LabelStmt(Empty);
13604c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13614c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13628538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_IF:
13634c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) IfStmt(Empty);
13644c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13654c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13668538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_SWITCH:
13674c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) SwitchStmt(Empty);
13684c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13694c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13708538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_WHILE:
13714c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) WhileStmt(Empty);
13724c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13734c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13748538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_DO:
13754c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) DoStmt(Empty);
13764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
13788538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_FOR:
13794c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ForStmt(Empty);
13804c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13828538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_GOTO:
13834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) GotoStmt(Empty);
13844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
13868538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_INDIRECT_GOTO:
13874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) IndirectGotoStmt(Empty);
13884c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13908538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_CONTINUE:
13914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ContinueStmt(Empty);
13924c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13948538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_BREAK:
13954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) BreakStmt(Empty);
13964c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13974c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13988538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_RETURN:
13994c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ReturnStmt(Empty);
14004c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14014c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14028538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_DECL:
14034c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) DeclStmt(Empty);
14044c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14054c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14068538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_ASM:
14074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) AsmStmt(Empty);
14084c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14094c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14108538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_PREDEFINED:
14114c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) PredefinedExpr(Empty);
14124c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
14148538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_DECL_REF:
1415663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      S = DeclRefExpr::CreateEmpty(*Context,
141660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                         /*HasQualifier=*/Record[ASTStmtReader::NumExprFields],
141760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                  /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields + 1]);
14184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
14208538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_INTEGER_LITERAL:
14219996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis      S = IntegerLiteral::Create(*Context, Empty);
14224c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
14248538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_FLOATING_LITERAL:
14259996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis      S = FloatingLiteral::Create(*Context, Empty);
14264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
14288538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_IMAGINARY_LITERAL:
14294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ImaginaryLiteral(Empty);
14304c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14328538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_STRING_LITERAL:
14331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      S = StringLiteral::CreateEmpty(*Context,
143460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                     Record[ASTStmtReader::NumExprFields + 1]);
14354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14364c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14378538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CHARACTER_LITERAL:
14384c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) CharacterLiteral(Empty);
14394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14418538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_PAREN:
14424c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ParenExpr(Empty);
14434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14444c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14458538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_PAREN_LIST:
144637bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis      S = new (Context) ParenListExpr(Empty);
144737bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis      break;
144837bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis
14498538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_UNARY_OPERATOR:
14504c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) UnaryOperator(Empty);
14514c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14524c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14538538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OFFSETOF:
14548ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      S = OffsetOfExpr::CreateEmpty(*Context,
145560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                    Record[ASTStmtReader::NumExprFields],
145660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                    Record[ASTStmtReader::NumExprFields + 1]);
14578ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
14588ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
14598538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_SIZEOF_ALIGN_OF:
14604c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) SizeOfAlignOfExpr(Empty);
14614c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14624c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14638538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_ARRAY_SUBSCRIPT:
14644c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ArraySubscriptExpr(Empty);
14654c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14664c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14678538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CALL:
1468ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis      S = new (Context) CallExpr(*Context, Stmt::CallExprClass, Empty);
14694c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14704c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14718538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_MEMBER: {
1472663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      // We load everything here and fully initialize it at creation.
1473663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      // That way we can use MemberExpr::Create and don't have to duplicate its
1474663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      // logic with a MemberExpr::CreateEmpty.
1475663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
1476663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      assert(Idx == 0);
1477663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      NestedNameSpecifier *NNS = 0;
1478663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      SourceRange QualifierRange;
1479663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      if (Record[Idx++]) { // HasQualifier.
1480663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis        NNS = ReadNestedNameSpecifier(Record, Idx);
1481663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis        QualifierRange = ReadSourceRange(Record, Idx);
1482663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      }
1483663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
1484663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      TemplateArgumentListInfo ArgInfo;
1485663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      unsigned NumTemplateArgs = Record[Idx++];
1486663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      if (NumTemplateArgs) {
1487663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis        ArgInfo.setLAngleLoc(ReadSourceLocation(Record, Idx));
1488663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis        ArgInfo.setRAngleLoc(ReadSourceLocation(Record, Idx));
1489663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis        for (unsigned i = 0; i != NumTemplateArgs; ++i)
1490577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl          ArgInfo.addArgument(ReadTemplateArgumentLoc(Cursor, Record, Idx));
1491663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      }
1492663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
1493663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      NamedDecl *FoundD = cast_or_null<NamedDecl>(GetDecl(Record[Idx++]));
1494663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
1495663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      DeclAccessPair FoundDecl = DeclAccessPair::make(FoundD, AS);
1496663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
1497663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      QualType T = GetType(Record[Idx++]);
1498663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      Expr *Base = ReadSubExpr();
1499663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      ValueDecl *MemberD = cast<ValueDecl>(GetDecl(Record[Idx++]));
15002577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      // FIXME: read DeclarationNameLoc.
1501663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      SourceLocation MemberLoc = ReadSourceLocation(Record, Idx);
15022577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      DeclarationNameInfo MemberNameInfo(MemberD->getDeclName(), MemberLoc);
1503663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      bool IsArrow = Record[Idx++];
1504663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
1505663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      S = MemberExpr::Create(*Context, Base, IsArrow, NNS, QualifierRange,
15062577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                             MemberD, FoundDecl, MemberNameInfo,
1507663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis                             NumTemplateArgs ? &ArgInfo : 0, T);
15084c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
1509663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis    }
15104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15118538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_BINARY_OPERATOR:
15124c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) BinaryOperator(Empty);
15134c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15158538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_COMPOUND_ASSIGN_OPERATOR:
15164c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) CompoundAssignOperator(Empty);
15174c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15198538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CONDITIONAL_OPERATOR:
15204c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ConditionalOperator(Empty);
15214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15224c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15238538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_IMPLICIT_CAST:
1524f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      S = ImplicitCastExpr::CreateEmpty(*Context,
152560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
15264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15288538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CSTYLE_CAST:
1529f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      S = CStyleCastExpr::CreateEmpty(*Context,
153060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
15314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15338538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_COMPOUND_LITERAL:
15344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) CompoundLiteralExpr(Empty);
15354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15364c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15378538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_EXT_VECTOR_ELEMENT:
15384c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ExtVectorElementExpr(Empty);
15394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15418538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_INIT_LIST:
1542709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek      S = new (Context) InitListExpr(*getContext(), Empty);
15434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15444c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15458538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_DESIGNATED_INIT:
1546d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner      S = DesignatedInitExpr::CreateEmpty(*Context,
154760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                     Record[ASTStmtReader::NumExprFields] - 1);
15481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15494c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15504c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15518538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_IMPLICIT_VALUE_INIT:
15524c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ImplicitValueInitExpr(Empty);
15534c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15544c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15558538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_VA_ARG:
15564c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) VAArgExpr(Empty);
15574c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15584c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15598538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_ADDR_LABEL:
15604c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) AddrLabelExpr(Empty);
15614c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15624c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15638538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_STMT:
15644c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) StmtExpr(Empty);
15654c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15664c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15678538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_TYPES_COMPATIBLE:
15684c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) TypesCompatibleExpr(Empty);
15694c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15704c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15718538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CHOOSE:
15724c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ChooseExpr(Empty);
15734c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15744c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15758538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_GNU_NULL:
15764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) GNUNullExpr(Empty);
15774c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15784c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15798538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_SHUFFLE_VECTOR:
15804c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ShuffleVectorExpr(Empty);
15814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15838538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_BLOCK:
15844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) BlockExpr(Empty);
15854c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15878538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_BLOCK_DECL_REF:
15884c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) BlockDeclRefExpr(Empty);
15894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15918538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_STRING_LITERAL:
15924c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCStringLiteral(Empty);
15934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15948538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_ENCODE:
15954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCEncodeExpr(Empty);
15964c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15978538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_SELECTOR_EXPR:
15984c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCSelectorExpr(Empty);
15994c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16008538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_PROTOCOL_EXPR:
16014c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCProtocolExpr(Empty);
16024c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16038538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_IVAR_REF_EXPR:
16044c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCIvarRefExpr(Empty);
16054c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16068538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_PROPERTY_REF_EXPR:
16074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCPropertyRefExpr(Empty);
16084c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16098538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_KVC_REF_EXPR:
161009105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian      S = new (Context) ObjCImplicitSetterGetterRefExpr(Empty);
16114c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16128538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_MESSAGE_EXPR:
161304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor      S = ObjCMessageExpr::CreateEmpty(*Context,
161460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                     Record[ASTStmtReader::NumExprFields]);
16154c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16168538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_SUPER_EXPR:
16174c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCSuperExpr(Empty);
16184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16198538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_ISA:
1620f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff      S = new (Context) ObjCIsaExpr(Empty);
1621f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff      break;
16228538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_FOR_COLLECTION:
16234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCForCollectionStmt(Empty);
16244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16258538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_CATCH:
16264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCAtCatchStmt(Empty);
16274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16288538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_FINALLY:
16294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCAtFinallyStmt(Empty);
16304c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16318538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_AT_TRY:
16328f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor      S = ObjCAtTryStmt::CreateEmpty(*Context,
163360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                     Record[ASTStmtReader::NumStmtFields],
163460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                     Record[ASTStmtReader::NumStmtFields + 1]);
16354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16368538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_AT_SYNCHRONIZED:
16374c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCAtSynchronizedStmt(Empty);
16384c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16398538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_AT_THROW:
16404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCAtThrowStmt(Empty);
16414c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16438538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_CXX_CATCH:
16447cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis      S = new (Context) CXXCatchStmt(Empty);
16457cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis      break;
16467cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis
16478538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_CXX_TRY:
16487cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis      S = CXXTryStmt::Create(*Context, Empty,
164960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl             /*NumHandlers=*/Record[ASTStmtReader::NumStmtFields]);
16507cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis      break;
16517cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis
16528538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_OPERATOR_CALL:
1653ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis      S = new (Context) CXXOperatorCallExpr(*Context, Empty);
1654ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis      break;
16551817bd483b538fd3f4530649f5cb900bad9e8a76Chris Lattner
16568538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_MEMBER_CALL:
16571817bd483b538fd3f4530649f5cb900bad9e8a76Chris Lattner      S = new (Context) CXXMemberCallExpr(*Context, Empty);
16581817bd483b538fd3f4530649f5cb900bad9e8a76Chris Lattner      break;
165939da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor
16608538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_CONSTRUCT:
16616d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis      S = new (Context) CXXConstructExpr(Empty);
16626d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis      break;
16636d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis
16648538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_TEMPORARY_OBJECT:
16656d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis      S = new (Context) CXXTemporaryObjectExpr(Empty);
166639da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor      break;
1667ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
16688538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_STATIC_CAST:
1669f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      S = CXXStaticCastExpr::CreateEmpty(*Context,
167060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1671ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig      break;
1672ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
16738538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_DYNAMIC_CAST:
1674f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      S = CXXDynamicCastExpr::CreateEmpty(*Context,
167560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1676ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig      break;
1677ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
16788538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_REINTERPRET_CAST:
1679f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      S = CXXReinterpretCastExpr::CreateEmpty(*Context,
168060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1681ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig      break;
1682ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
16838538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_CONST_CAST:
1684f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      S = CXXConstCastExpr::CreateEmpty(*Context);
1685ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig      break;
1686ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
16878538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_FUNCTIONAL_CAST:
1688f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      S = CXXFunctionalCastExpr::CreateEmpty(*Context,
168960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1690ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig      break;
1691ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
16928538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_BOOL_LITERAL:
1693eb7f96141f754150a92433286fa385910a22f494Sam Weinig      S = new (Context) CXXBoolLiteralExpr(Empty);
1694eb7f96141f754150a92433286fa385910a22f494Sam Weinig      break;
1695ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
16968538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_NULL_PTR_LITERAL:
1697eb7f96141f754150a92433286fa385910a22f494Sam Weinig      S = new (Context) CXXNullPtrLiteralExpr(Empty);
1698eb7f96141f754150a92433286fa385910a22f494Sam Weinig      break;
16998538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_TYPEID_EXPR:
170014ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner      S = new (Context) CXXTypeidExpr(Empty, true);
170114ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner      break;
17028538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_TYPEID_TYPE:
170314ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner      S = new (Context) CXXTypeidExpr(Empty, false);
170414ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner      break;
170501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    case EXPR_CXX_UUIDOF_EXPR:
170601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet      S = new (Context) CXXUuidofExpr(Empty, true);
170701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet      break;
170801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    case EXPR_CXX_UUIDOF_TYPE:
170901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet      S = new (Context) CXXUuidofExpr(Empty, false);
171001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet      break;
17118538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_THIS:
17122fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner      S = new (Context) CXXThisExpr(Empty);
17132fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner      break;
17148538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_THROW:
17152fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner      S = new (Context) CXXThrowExpr(Empty);
17162fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner      break;
17178538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_DEFAULT_ARG: {
171860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl      bool HasOtherExprStored = Record[ASTStmtReader::NumExprFields];
17198a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis      if (HasOtherExprStored) {
17208a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis        Expr *SubExpr = ReadSubExpr();
17218a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis        S = CXXDefaultArgExpr::Create(*Context, SourceLocation(), 0, SubExpr);
17228a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis      } else
17238a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis        S = new (Context) CXXDefaultArgExpr(Empty);
1724030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner      break;
17258a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis    }
17268538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_BIND_TEMPORARY:
1727d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner      S = new (Context) CXXBindTemporaryExpr(Empty);
1728d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner      break;
1729e2ca6d4a2f41876930fbd304caa706452d2569d8Douglas Gregor
17308538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_SCALAR_VALUE_INIT:
1731ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor      S = new (Context) CXXScalarValueInitExpr(Empty);
17325921863d8f24084797863b5df37842113bac4352Chris Lattner      break;
17338538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_NEW:
17345921863d8f24084797863b5df37842113bac4352Chris Lattner      S = new (Context) CXXNewExpr(Empty);
17355921863d8f24084797863b5df37842113bac4352Chris Lattner      break;
17368538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_DELETE:
173795fc98ce95d4faa4f1bb2783384150530404ea6fArgyrios Kyrtzidis      S = new (Context) CXXDeleteExpr(Empty);
173895fc98ce95d4faa4f1bb2783384150530404ea6fArgyrios Kyrtzidis      break;
17398538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_PSEUDO_DESTRUCTOR:
1740de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis      S = new (Context) CXXPseudoDestructorExpr(Empty);
1741de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis      break;
17425921863d8f24084797863b5df37842113bac4352Chris Lattner
17438538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_EXPR_WITH_TEMPORARIES:
1744d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner      S = new (Context) CXXExprWithTemporaries(Empty);
1745d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner      break;
17468dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
17478538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_DEPENDENT_SCOPE_MEMBER:
17488dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis      S = CXXDependentScopeMemberExpr::CreateEmpty(*Context,
174960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                      /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]);
17508dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis      break;
17518dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
17528538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_DEPENDENT_SCOPE_DECL_REF:
175312dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis      S = DependentScopeDeclRefExpr::CreateEmpty(*Context,
175460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                      /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]);
175512dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis      break;
175612dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis
17578538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_UNRESOLVED_CONSTRUCT:
17588dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis      S = CXXUnresolvedConstructExpr::CreateEmpty(*Context,
175960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                              /*NumArgs=*/Record[ASTStmtReader::NumExprFields]);
1760a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis      break;
1761a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
17628538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_UNRESOLVED_MEMBER:
1763a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis      S = UnresolvedMemberExpr::CreateEmpty(*Context,
176460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                      /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]);
17658dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis      break;
1766bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis
17678538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_UNRESOLVED_LOOKUP:
1768bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis      S = UnresolvedLookupExpr::CreateEmpty(*Context,
176960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                      /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]);
1770bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis      break;
17716d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis
17728538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_UNARY_TYPE_TRAIT:
17736d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis      S = new (Context) UnaryTypeTraitExpr(Empty);
17746d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis      break;
17756b219d082434394c1ac401390ec1d1967727815aSebastian Redl
17766b219d082434394c1ac401390ec1d1967727815aSebastian Redl    case EXPR_CXX_NOEXCEPT:
17776b219d082434394c1ac401390ec1d1967727815aSebastian Redl      S = new (Context) CXXNoexceptExpr(Empty);
17786b219d082434394c1ac401390ec1d1967727815aSebastian Redl      break;
17794c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
17806d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis
17814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    // We hit a STMT_STOP, so we're done with this expression.
17824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    if (Finished)
17834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
17854c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    ++NumStatementsRead;
17864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
1787919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    if (S)
1788919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis      Reader.Visit(S);
17894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
17904c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    assert(Idx == Record.size() && "Invalid deserialization of statement");
17914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    StmtStack.push_back(S);
17924c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
1793919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
1794919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis#ifndef NDEBUG
1795919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  assert(StmtStack.size() > PrevNumStmts && "Read too many sub stmts!");
1796919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  assert(StmtStack.size() == PrevNumStmts + 1 && "Extra expressions on stack!");
1797919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis#endif
1798919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
1799919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  return StmtStack.pop_back_val();
18004c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
1801