ASTReaderStmt.cpp revision 1a18600b85aaa691122983dd8dcf4225cfc9ef68
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++]));
222355a9fe26a6dec89680ddf713dd5bc7a671b298aArgyrios Kyrtzidis  S->setUsed(Record[Idx++]);
2231a18600b85aaa691122983dd8dcf4225cfc9ef68Argyrios Kyrtzidis  S->setUnusedAttribute(Record[Idx++]);
2244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  Reader.RecordLabelStmt(S, Record[Idx++]);
2254c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
22760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitIfStmt(IfStmt *S) {
2284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
22943dec6bbde2d0a16c35978983761c8b7030c8e18Douglas Gregor  S->setConditionVariable(*Reader.getContext(),
23043dec6bbde2d0a16c35978983761c8b7030c8e18Douglas Gregor                          cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
231d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCond(Reader.ReadSubExpr());
232d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setThen(Reader.ReadSubStmt());
233d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setElse(Reader.ReadSubStmt());
2344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setIfLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
235d06f6ca61062f85926eb9d409eb3d4f8afcf93c7Douglas Gregor  S->setElseLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2364c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2374c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
23860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitSwitchStmt(SwitchStmt *S) {
2394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
24043dec6bbde2d0a16c35978983761c8b7030c8e18Douglas Gregor  S->setConditionVariable(*Reader.getContext(),
24143dec6bbde2d0a16c35978983761c8b7030c8e18Douglas Gregor                          cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
242d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCond(Reader.ReadSubExpr());
243d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setBody(Reader.ReadSubStmt());
2444c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setSwitchLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
245559fb554602bedb57dbbf3cc14ac8a38264b4547Ted Kremenek  if (Record[Idx++])
246559fb554602bedb57dbbf3cc14ac8a38264b4547Ted Kremenek    S->setAllEnumCasesCovered();
247559fb554602bedb57dbbf3cc14ac8a38264b4547Ted Kremenek
2484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  SwitchCase *PrevSC = 0;
2494c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned N = Record.size(); Idx != N; ++Idx) {
2504c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    SwitchCase *SC = Reader.getSwitchCaseWithID(Record[Idx]);
2514c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    if (PrevSC)
2524c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      PrevSC->setNextSwitchCase(SC);
2534c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    else
2544c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S->setSwitchCaseList(SC);
2551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
25643d9d9243329b1b75d1a6efdad9f16d6fb386b8eDouglas Gregor    // Retain this SwitchCase, since SwitchStmt::addSwitchCase() would
25743d9d9243329b1b75d1a6efdad9f16d6fb386b8eDouglas Gregor    // normally retain it (but we aren't calling addSwitchCase).
25843d9d9243329b1b75d1a6efdad9f16d6fb386b8eDouglas Gregor    SC->Retain();
2594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    PrevSC = SC;
2604c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
2614c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2624c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
26360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitWhileStmt(WhileStmt *S) {
2644c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
26543dec6bbde2d0a16c35978983761c8b7030c8e18Douglas Gregor  S->setConditionVariable(*Reader.getContext(),
26643dec6bbde2d0a16c35978983761c8b7030c8e18Douglas Gregor                          cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
267d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCond(Reader.ReadSubExpr());
268d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setBody(Reader.ReadSubStmt());
2694c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setWhileLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2704c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2714c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
27260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitDoStmt(DoStmt *S) {
2734c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
274d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCond(Reader.ReadSubExpr());
275d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setBody(Reader.ReadSubStmt());
2764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setDoLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2779f3ca2a7747bd47f14d7693f333103fac29a24d2Douglas Gregor  S->setWhileLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
278989135901c750af61ef012b6b0a0368be415bc46Chris Lattner  S->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2794c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2804c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
28160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitForStmt(ForStmt *S) {
2824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
283d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setInit(Reader.ReadSubStmt());
284d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCond(Reader.ReadSubExpr());
28543dec6bbde2d0a16c35978983761c8b7030c8e18Douglas Gregor  S->setConditionVariable(*Reader.getContext(),
28643dec6bbde2d0a16c35978983761c8b7030c8e18Douglas Gregor                          cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
287d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setInc(Reader.ReadSubExpr());
288d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setBody(Reader.ReadSubStmt());
2894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setForLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2905831c6a1efc47e6a19d82fe3dd25b5b8fef6979dDouglas Gregor  S->setLParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2915831c6a1efc47e6a19d82fe3dd25b5b8fef6979dDouglas Gregor  S->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2924c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
29460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitGotoStmt(GotoStmt *S) {
2954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
2964c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  Reader.SetLabelOf(S, Record[Idx++]);
2974c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setGotoLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2984c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setLabelLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2994c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3004c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
30160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
3024c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
3034c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setGotoLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
3045f1b9e689fa5c101512aef99225f2afea1673449Douglas Gregor  S->setStarLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
305d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setTarget(Reader.ReadSubExpr());
3064c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
30860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitContinueStmt(ContinueStmt *S) {
3094c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
3104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setContinueLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
3114c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3124c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
31360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitBreakStmt(BreakStmt *S) {
3144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
3154c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setBreakLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
3164c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3174c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
31860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitReturnStmt(ReturnStmt *S) {
3194c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
320d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setRetValue(Reader.ReadSubExpr());
3214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setReturnLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
3225077c3876beeaed32280af88244e8050078619a8Douglas Gregor  S->setNRVOCandidate(cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
3234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
32560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitDeclStmt(DeclStmt *S) {
3264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
3274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setStartLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
3284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setEndLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
3294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
3304c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  if (Idx + 1 == Record.size()) {
3314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    // Single declaration
3324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    S->setDeclGroup(DeclGroupRef(Reader.GetDecl(Record[Idx++])));
3334c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  } else {
3344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    llvm::SmallVector<Decl *, 16> Decls;
3354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    Decls.reserve(Record.size() - Idx);
3364c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    for (unsigned N = Record.size(); Idx != N; ++Idx)
3374c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      Decls.push_back(Reader.GetDecl(Record[Idx]));
338d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    S->setDeclGroup(DeclGroupRef(DeclGroup::Create(*Reader.getContext(),
33975fdb2377604e53678102076991bea345ace4692Douglas Gregor                                                   Decls.data(),
34075fdb2377604e53678102076991bea345ace4692Douglas Gregor                                                   Decls.size())));
3414c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
3424c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
34460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitAsmStmt(AsmStmt *S) {
3454c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
3464c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned NumOutputs = Record[Idx++];
3474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned NumInputs = Record[Idx++];
3484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned NumClobbers = Record[Idx++];
3494c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setAsmLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
3504c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
3514c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setVolatile(Record[Idx++]);
3524c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setSimple(Record[Idx++]);
3533b11fd3b52e7b88233c602407c151d07cb093e75Mike Stump  S->setMSAsm(Record[Idx++]);
3541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
355d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setAsmString(cast_or_null<StringLiteral>(Reader.ReadSubStmt()));
3564c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
3574c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  // Outputs and inputs
358ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson  llvm::SmallVector<IdentifierInfo *, 16> Names;
3594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  llvm::SmallVector<StringLiteral*, 16> Constraints;
3604c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  llvm::SmallVector<Stmt*, 16> Exprs;
3614c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0, N = NumOutputs + NumInputs; I != N; ++I) {
362ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson    Names.push_back(Reader.GetIdentifierInfo(Record, Idx));
363d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    Constraints.push_back(cast_or_null<StringLiteral>(Reader.ReadSubStmt()));
364d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    Exprs.push_back(Reader.ReadSubStmt());
3654c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
3664c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
3674c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  // Constraints
3684c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  llvm::SmallVector<StringLiteral*, 16> Clobbers;
3694c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0; I != NumClobbers; ++I)
370d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    Clobbers.push_back(cast_or_null<StringLiteral>(Reader.ReadSubStmt()));
371fdba9c069023f686e2608affde02c82131ee1cf8Anders Carlsson
372acb6bcb442936f3c14126fdd473307c17647cb84Anders Carlsson  S->setOutputsAndInputsAndClobbers(*Reader.getContext(),
373acb6bcb442936f3c14126fdd473307c17647cb84Anders Carlsson                                    Names.data(), Constraints.data(),
374fdba9c069023f686e2608affde02c82131ee1cf8Anders Carlsson                                    Exprs.data(), NumOutputs, NumInputs,
375fdba9c069023f686e2608affde02c82131ee1cf8Anders Carlsson                                    Clobbers.data(), NumClobbers);
3764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3774c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
37860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitExpr(Expr *E) {
3794c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(E);
3804c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setType(Reader.GetType(Record[Idx++]));
3814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setTypeDependent(Record[Idx++]);
3824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setValueDependent(Record[Idx++]);
3834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  assert(Idx == NumExprFields && "Incorrect expression field count");
3844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3854c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
38660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitPredefinedExpr(PredefinedExpr *E) {
3874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
3884c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
3894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setIdentType((PredefinedExpr::IdentType)Record[Idx++]);
3904c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
39260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitDeclRefExpr(DeclRefExpr *E) {
3934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
394663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
395663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  bool HasQualifier = Record[Idx++];
396663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  unsigned NumTemplateArgs = Record[Idx++];
397663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
398663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  E->DecoratedD.setInt((HasQualifier? DeclRefExpr::HasQualifierFlag : 0) |
399663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      (NumTemplateArgs ? DeclRefExpr::HasExplicitTemplateArgumentListFlag : 0));
400663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
401663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  if (HasQualifier) {
402663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis    E->getNameQualifier()->NNS = Reader.ReadNestedNameSpecifier(Record, Idx);
403663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis    E->getNameQualifier()->Range = Reader.ReadSourceRange(Record, Idx);
404663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  }
405663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
406663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  if (NumTemplateArgs)
407096832c5ed5b9106fa177ebc148489760c3bc496John McCall    ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),
408663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis                                     NumTemplateArgs);
409663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
410dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  E->setDecl(cast<ValueDecl>(Reader.GetDecl(Record[Idx++])));
4112577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  // FIXME: read DeclarationNameLoc.
412663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  E->setLocation(Reader.ReadSourceLocation(Record, Idx));
4134c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
41560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitIntegerLiteral(IntegerLiteral *E) {
4164c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
4174c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
4189996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  E->setValue(*Reader.getContext(), Reader.ReadAPInt(Record, Idx));
4194c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4204c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
42160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitFloatingLiteral(FloatingLiteral *E) {
4224c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
4239996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  E->setValue(*Reader.getContext(), Reader.ReadAPFloat(Record, Idx));
4244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setExact(Record[Idx++]);
4254c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
4264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
42860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitImaginaryLiteral(ImaginaryLiteral *E) {
4294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
430d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
4314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
43360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitStringLiteral(StringLiteral *E) {
4344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
4354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned Len = Record[Idx++];
4361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  assert(Record[Idx] == E->getNumConcatenated() &&
4374c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner         "Wrong number of concatenated tokens!");
4384c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  ++Idx;
4394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setWide(Record[Idx++]);
4404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
4411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Read string data
442b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar  llvm::SmallString<16> Str(&Record[Idx], &Record[Idx] + Len);
443b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar  E->setString(*Reader.getContext(), Str.str());
4444c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  Idx += Len;
4454c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
4464c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  // Read source locations
4474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0, N = E->getNumConcatenated(); I != N; ++I)
4484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    E->setStrTokenLoc(I, SourceLocation::getFromRawEncoding(Record[Idx++]));
4494c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4504c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
45160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCharacterLiteral(CharacterLiteral *E) {
4524c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
4534c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setValue(Record[Idx++]);
4544c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
4554c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setWide(Record[Idx++]);
4564c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4574c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
45860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitParenExpr(ParenExpr *E) {
4594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
4604c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLParen(SourceLocation::getFromRawEncoding(Record[Idx++]));
4614c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParen(SourceLocation::getFromRawEncoding(Record[Idx++]));
462d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
4634c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4644c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
46560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitParenListExpr(ParenListExpr *E) {
46637bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  VisitExpr(E);
46737bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  unsigned NumExprs = Record[Idx++];
46837bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  E->Exprs = new (*Reader.getContext()) Stmt*[NumExprs];
46937bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  for (unsigned i = 0; i != NumExprs; ++i)
47037bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis    E->Exprs[i] = Reader.ReadSubStmt();
47137bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  E->NumExprs = NumExprs;
47237bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  E->LParenLoc = Reader.ReadSourceLocation(Record, Idx);
47337bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  E->RParenLoc = Reader.ReadSourceLocation(Record, Idx);
47437bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis}
47537bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis
47660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitUnaryOperator(UnaryOperator *E) {
4774c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
478d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
4794c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setOpcode((UnaryOperator::Opcode)Record[Idx++]);
4804c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setOperatorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
4814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
48360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitOffsetOfExpr(OffsetOfExpr *E) {
4848ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  typedef OffsetOfExpr::OffsetOfNode Node;
4858ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  VisitExpr(E);
4868ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  assert(E->getNumComponents() == Record[Idx]);
4878ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  ++Idx;
4888ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  assert(E->getNumExpressions() == Record[Idx]);
4898ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  ++Idx;
4908ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  E->setOperatorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
4918ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
492577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  E->setTypeSourceInfo(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
4938ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
4948ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Node::Kind Kind = static_cast<Node::Kind>(Record[Idx++]);
4958ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    SourceLocation Start = SourceLocation::getFromRawEncoding(Record[Idx++]);
4968ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    SourceLocation End = SourceLocation::getFromRawEncoding(Record[Idx++]);
4978ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    switch (Kind) {
4988ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Array:
4998ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      E->setComponent(I, Node(Start, Record[Idx++], End));
5008ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
5018ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
5028ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Field:
5038ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      E->setComponent(I,
5048ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor             Node(Start,
5058ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                  dyn_cast_or_null<FieldDecl>(Reader.GetDecl(Record[Idx++])),
5068ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                  End));
5078ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
5088ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
5098ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Identifier:
5108ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      E->setComponent(I, Node(Start, Reader.GetIdentifier(Record[Idx++]), End));
5118ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
512cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor
513afbf3127cbdebc7d3d8711c51b1d013afa57e849Argyrios Kyrtzidis    case Node::Base: {
514afbf3127cbdebc7d3d8711c51b1d013afa57e849Argyrios Kyrtzidis      CXXBaseSpecifier *Base = new (*Reader.getContext()) CXXBaseSpecifier();
515afbf3127cbdebc7d3d8711c51b1d013afa57e849Argyrios Kyrtzidis      *Base = Reader.ReadCXXBaseSpecifier(DeclsCursor, Record, Idx);
516afbf3127cbdebc7d3d8711c51b1d013afa57e849Argyrios Kyrtzidis      E->setComponent(I, Node(Base));
517cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      break;
5188ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
519afbf3127cbdebc7d3d8711c51b1d013afa57e849Argyrios Kyrtzidis    }
5208ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
5218ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
5228ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I)
523d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setIndexExpr(I, Reader.ReadSubExpr());
5248ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
5258ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
52660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
5274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
5284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setSizeof(Record[Idx++]);
5294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  if (Record[Idx] == 0) {
530d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setArgument(Reader.ReadSubExpr());
5314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    ++Idx;
5324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  } else {
533577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    E->setArgument(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
5344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
5354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setOperatorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
5364c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
5374c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5384c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
53960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
5404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
541d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setLHS(Reader.ReadSubExpr());
542d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setRHS(Reader.ReadSubExpr());
5434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRBracketLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
5444c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5454c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
54660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCallExpr(CallExpr *E) {
5474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
548d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner  E->setNumArgs(*Reader.getContext(), Record[Idx++]);
5494c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
550d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setCallee(Reader.ReadSubExpr());
5514c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
552d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setArg(I, Reader.ReadSubExpr());
5534c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5544c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
55560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitMemberExpr(MemberExpr *E) {
556663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  // Don't call VisitExpr, this is fully initialized at creation.
557663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  assert(E->getStmtClass() == Stmt::MemberExprClass &&
558663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis         "It's a subclass, we must advance Idx!");
5594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5604c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
56160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCIsaExpr(ObjCIsaExpr *E) {
562f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff  VisitExpr(E);
563d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
564f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff  E->setIsaMemberLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
565f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff  E->setArrow(Record[Idx++]);
566f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff}
567f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff
56860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCastExpr(CastExpr *E) {
5694c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
570f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  unsigned NumBaseSpecs = Record[Idx++];
571f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  assert(NumBaseSpecs == E->path_size());
572d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
573cdef2b75aa60cde1ca00e0aa3f89139ac89c6ae4Anders Carlsson  E->setCastKind((CastExpr::CastKind)Record[Idx++]);
574f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  CastExpr::path_iterator BaseI = E->path_begin();
5750745d0a648b75bd304045309276c70a755adaafbArgyrios Kyrtzidis  while (NumBaseSpecs--) {
5760745d0a648b75bd304045309276c70a755adaafbArgyrios Kyrtzidis    CXXBaseSpecifier *BaseSpec = new (*Reader.getContext()) CXXBaseSpecifier;
5775606220447c7901ba8d80147ddab893bb7949dd5Nick Lewycky    *BaseSpec = Reader.ReadCXXBaseSpecifier(DeclsCursor, Record, Idx);
578f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    *BaseI++ = BaseSpec;
5790745d0a648b75bd304045309276c70a755adaafbArgyrios Kyrtzidis  }
5804c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
58260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitBinaryOperator(BinaryOperator *E) {
5834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
584d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setLHS(Reader.ReadSubExpr());
585d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setRHS(Reader.ReadSubExpr());
5864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setOpcode((BinaryOperator::Opcode)Record[Idx++]);
5874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setOperatorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
5884c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
59060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
5914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitBinaryOperator(E);
5924c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setComputationLHSType(Reader.GetType(Record[Idx++]));
5934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setComputationResultType(Reader.GetType(Record[Idx++]));
5944c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
59660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitConditionalOperator(ConditionalOperator *E) {
5974c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
598d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setCond(Reader.ReadSubExpr());
599d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setLHS(Reader.ReadSubExpr());
600d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setRHS(Reader.ReadSubExpr());
601f9b949fecf339a2c9bd97dd11a272c4878f85ce4Fariborz Jahanian  E->setSAVE(Reader.ReadSubExpr());
60247e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor  E->setQuestionLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
60347e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor  E->setColonLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
6044c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
6054c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
60660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitImplicitCastExpr(ImplicitCastExpr *E) {
6074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitCastExpr(E);
6085baba9d98364a3525d6afa15a04cdad82fd6dd30John McCall  E->setValueKind(static_cast<ExprValueKind>(Record[Idx++]));
6094c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
6104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
61160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitExplicitCastExpr(ExplicitCastExpr *E) {
6124c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitCastExpr(E);
613577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  E->setTypeInfoAsWritten(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
6144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
6154c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
61660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCStyleCastExpr(CStyleCastExpr *E) {
6174c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExplicitCastExpr(E);
6184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
6194c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
6204c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
6214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
62260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
6234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
6244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
625577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  E->setTypeSourceInfo(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
626d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setInitializer(Reader.ReadSubExpr());
6274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setFileScope(Record[Idx++]);
6284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
6294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
63060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
6314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
632d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
6334c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setAccessor(Reader.GetIdentifierInfo(Record, Idx));
6344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setAccessorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
6354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
6364c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
63760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitInitListExpr(InitListExpr *E) {
6384c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
6394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned NumInits = Record[Idx++];
640709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek  E->reserveInits(*Reader.getContext(), NumInits);
6414c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0; I != NumInits; ++I)
642d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->updateInit(*Reader.getContext(), I, Reader.ReadSubExpr());
643d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSyntacticForm(cast_or_null<InitListExpr>(Reader.ReadSubStmt()));
6444c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLBraceLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
6454c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRBraceLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
6464c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setInitializedFieldInUnion(
6474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner                      cast_or_null<FieldDecl>(Reader.GetDecl(Record[Idx++])));
6484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->sawArrayRangeDesignator(Record[Idx++]);
6494c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
6504c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
65160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
6524c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  typedef DesignatedInitExpr::Designator Designator;
6534c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
6544c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
6554c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned NumSubExprs = Record[Idx++];
6564c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  assert(NumSubExprs == E->getNumSubExprs() && "Wrong number of subexprs");
6574c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0; I != NumSubExprs; ++I)
658d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setSubExpr(I, Reader.ReadSubExpr());
6594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setEqualOrColonLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
6604c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setGNUSyntax(Record[Idx++]);
6614c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
6624c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  llvm::SmallVector<Designator, 4> Designators;
6634c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  while (Idx < Record.size()) {
6648538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    switch ((DesignatorTypes)Record[Idx++]) {
6658538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case DESIG_FIELD_DECL: {
6664c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      FieldDecl *Field = cast<FieldDecl>(Reader.GetDecl(Record[Idx++]));
6671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      SourceLocation DotLoc
6684c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        = SourceLocation::getFromRawEncoding(Record[Idx++]);
6691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      SourceLocation FieldLoc
6704c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        = SourceLocation::getFromRawEncoding(Record[Idx++]);
6711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Designators.push_back(Designator(Field->getIdentifier(), DotLoc,
6724c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner                                       FieldLoc));
6734c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      Designators.back().setField(Field);
6744c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
6754c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
6764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
6778538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case DESIG_FIELD_NAME: {
6784c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      const IdentifierInfo *Name = Reader.GetIdentifierInfo(Record, Idx);
6791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      SourceLocation DotLoc
6804c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        = SourceLocation::getFromRawEncoding(Record[Idx++]);
6811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      SourceLocation FieldLoc
6824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        = SourceLocation::getFromRawEncoding(Record[Idx++]);
6834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      Designators.push_back(Designator(Name, DotLoc, FieldLoc));
6844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
6854c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
6861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6878538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case DESIG_ARRAY: {
6884c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      unsigned Index = Record[Idx++];
6894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      SourceLocation LBracketLoc
6904c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        = SourceLocation::getFromRawEncoding(Record[Idx++]);
6914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      SourceLocation RBracketLoc
6924c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        = SourceLocation::getFromRawEncoding(Record[Idx++]);
6934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      Designators.push_back(Designator(Index, LBracketLoc, RBracketLoc));
6944c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
6954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
6964c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
6978538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case DESIG_ARRAY_RANGE: {
6984c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      unsigned Index = Record[Idx++];
6994c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      SourceLocation LBracketLoc
7004c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        = SourceLocation::getFromRawEncoding(Record[Idx++]);
7014c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      SourceLocation EllipsisLoc
7024c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        = SourceLocation::getFromRawEncoding(Record[Idx++]);
7034c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      SourceLocation RBracketLoc
7044c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        = SourceLocation::getFromRawEncoding(Record[Idx++]);
7054c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      Designators.push_back(Designator(Index, LBracketLoc, EllipsisLoc,
7064c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner                                       RBracketLoc));
7074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
7084c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
7094c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
7104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
711319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor  E->setDesignators(*Reader.getContext(),
712319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor                    Designators.data(), Designators.size());
7134c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
71560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
7164c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
7174c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
71960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitVAArgExpr(VAArgExpr *E) {
7204c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
721d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
7222cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara  E->setWrittenTypeInfo(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
7234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setBuiltinLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7254c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
72760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitAddrLabelExpr(AddrLabelExpr *E) {
7284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
7294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setAmpAmpLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7304c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLabelLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  Reader.SetLabelOf(E, Record[Idx++]);
7324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7334c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
73460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitStmtExpr(StmtExpr *E) {
7354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
7364c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7374c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
738d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubStmt(cast_or_null<CompoundStmt>(Reader.ReadSubStmt()));
7394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
74160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) {
7424c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
7433fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara  E->setArgTInfo1(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
7443fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara  E->setArgTInfo2(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
7454c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setBuiltinLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7464c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
74960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitChooseExpr(ChooseExpr *E) {
7504c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
751d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setCond(Reader.ReadSubExpr());
752d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setLHS(Reader.ReadSubExpr());
753d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setRHS(Reader.ReadSubExpr());
7544c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setBuiltinLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7554c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7564c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7574c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
75860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitGNUNullExpr(GNUNullExpr *E) {
7594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
7604c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setTokenLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
7614c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7624c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
76360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
7644c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
765919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  llvm::SmallVector<Expr *, 16> Exprs;
7664c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned NumExprs = Record[Idx++];
767919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  while (NumExprs--)
768d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    Exprs.push_back(Reader.ReadSubExpr());
769919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  E->setExprs(*Reader.getContext(), Exprs.data(), Exprs.size());
7704c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setBuiltinLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7714c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7724c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7734c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
77460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitBlockExpr(BlockExpr *E) {
7754c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
7764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setBlockDecl(cast_or_null<BlockDecl>(Reader.GetDecl(Record[Idx++])));
7774c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setHasBlockDeclRefExprs(Record[Idx++]);
7784c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7794c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
78060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitBlockDeclRefExpr(BlockDeclRefExpr *E) {
7814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
7824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setDecl(cast<ValueDecl>(Reader.GetDecl(Record[Idx++])));
7834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
7844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setByRef(Record[Idx++]);
7859b0b57c6f9996bfdb67248f6942dd23acfa36167Fariborz Jahanian  E->setConstQualAdded(Record[Idx++]);
786d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setCopyConstructorExpr(Reader.ReadSubExpr());
7874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7884c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
7894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner//===----------------------------------------------------------------------===//
7904c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner// Objective-C Expressions and Statements
7914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
79260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCStringLiteral(ObjCStringLiteral *E) {
7934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
794d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setString(cast<StringLiteral>(Reader.ReadSubStmt()));
7954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setAtLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7964c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7974c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
79860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
7994c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
800577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  E->setEncodedTypeSourceInfo(Reader.GetTypeSourceInfo(DeclsCursor,Record,Idx));
8014c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setAtLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
8024c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
8034c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8044c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
80560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
8064c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
8074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setSelector(Reader.GetSelector(Record, Idx));
8084c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setAtLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
8094c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
8104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8114c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
81260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
8134c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
8144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setProtocol(cast<ObjCProtocolDecl>(Reader.GetDecl(Record[Idx++])));
8154c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setAtLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
8164c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
8174c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
81960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
8204c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
8214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setDecl(cast<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++])));
8224c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
823d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
8244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setIsArrow(Record[Idx++]);
8254c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setIsFreeIvar(Record[Idx++]);
8264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
82860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
8294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
8304c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setProperty(cast<ObjCPropertyDecl>(Reader.GetDecl(Record[Idx++])));
8314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
832d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
8334c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
83560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCImplicitSetterGetterRefExpr(
83609105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian                                      ObjCImplicitSetterGetterRefExpr *E) {
8374c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
8384c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setGetterMethod(
8394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner                 cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++])));
8404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setSetterMethod(
8414c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner                 cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++])));
842d2ae5aa732e8587816fd7a7be911460e337c178eFariborz Jahanian  E->setInterfaceDecl(
8434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner              cast_or_null<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])));
844d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
8454c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
8464c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setClassLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
8474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
84960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCMessageExpr(ObjCMessageExpr *E) {
8504c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
85104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  assert(Record[Idx] == E->getNumArgs());
85204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  ++Idx;
85304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  ObjCMessageExpr::ReceiverKind Kind
85404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    = static_cast<ObjCMessageExpr::ReceiverKind>(Record[Idx++]);
85504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  switch (Kind) {
85604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::Instance:
857d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setInstanceReceiver(Reader.ReadSubExpr());
85804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
85904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
86004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::Class:
861577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    E->setClassReceiver(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
86204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
86304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
86404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::SuperClass:
86504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::SuperInstance: {
86604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    QualType T = Reader.GetType(Record[Idx++]);
86704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    SourceLocation SuperLoc = SourceLocation::getFromRawEncoding(Record[Idx++]);
86804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    E->setSuper(SuperLoc, T, Kind == ObjCMessageExpr::SuperInstance);
86904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
87004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  }
8714c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
8724c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
87304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  assert(Kind == E->getReceiverKind());
87404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
87504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  if (Record[Idx++])
87604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    E->setMethodDecl(cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++])));
87704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  else
87804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    E->setSelector(Reader.GetSelector(Record, Idx));
87904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
88004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  E->setLeftLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
88104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  E->setRightLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
88204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
8834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
884d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setArg(I, Reader.ReadSubExpr());
8854c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
88760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCSuperExpr(ObjCSuperExpr *E) {
8884c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
8894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
8904c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
89260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
8934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
894d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setElement(Reader.ReadSubStmt());
895d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCollection(Reader.ReadSubExpr());
896d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setBody(Reader.ReadSubStmt());
8974c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setForLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
8984c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
8994c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
9004c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
90160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
9024c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
903d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCatchBody(Reader.ReadSubStmt());
904c00d8e18ad3d903acfeb5d05163ce90713066a3fDouglas Gregor  S->setCatchParamDecl(cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
9054c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setAtCatchLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
9064c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
9074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
9084c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
90960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
9104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
911d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setFinallyBody(Reader.ReadSubStmt());
9124c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setAtFinallyLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
9134c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
9144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
91560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
9164c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
9178f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  assert(Record[Idx] == S->getNumCatchStmts());
9188f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  ++Idx;
9198f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  bool HasFinally = Record[Idx++];
920d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setTryBody(Reader.ReadSubStmt());
921919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I)
922d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    S->setCatchStmt(I, cast_or_null<ObjCAtCatchStmt>(Reader.ReadSubStmt()));
9238f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor
9248f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  if (HasFinally)
925d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    S->setFinallyStmt(Reader.ReadSubStmt());
9264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setAtTryLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
9274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
9284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
92960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {
9304c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
931d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setSynchExpr(Reader.ReadSubStmt());
932d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setSynchBody(Reader.ReadSubStmt());
9334c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setAtSynchronizedLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
9344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
9354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
93660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
9374c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
938d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setThrowExpr(Reader.ReadSubStmt());
9394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setThrowLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
9404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
9414c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
942ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
943ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis// C++ Expressions and Statements
9447cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
9457cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis
94660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXCatchStmt(CXXCatchStmt *S) {
9477cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  VisitStmt(S);
9487cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  S->CatchLoc = Reader.ReadSourceLocation(Record, Idx);
9497cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  S->ExceptionDecl = cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++]));
9507cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  S->HandlerBlock = Reader.ReadSubStmt();
9517cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis}
9527cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis
95360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXTryStmt(CXXTryStmt *S) {
9547cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  VisitStmt(S);
9557cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  assert(Record[Idx] == S->getNumHandlers() && "NumStmtFields is wrong ?");
9567cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  ++Idx;
9577cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  S->TryLoc = Reader.ReadSourceLocation(Record, Idx);
9587cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  S->getStmts()[0] = Reader.ReadSubStmt();
9597cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  for (unsigned i = 0, e = S->getNumHandlers(); i != e; ++i)
9607cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis    S->getStmts()[i + 1] = Reader.ReadSubStmt();
9617cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis}
962ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis
96360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
964919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  VisitCallExpr(E);
965ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis  E->setOperator((OverloadedOperatorKind)Record[Idx++]);
966ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis}
967ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis
96860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXConstructExpr(CXXConstructExpr *E) {
96939da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor  VisitExpr(E);
9706d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  E->NumArgs = Record[Idx++];
9716d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  if (E->NumArgs)
9726d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis    E->Args = new (*Reader.getContext()) Stmt*[E->NumArgs];
9735e1b7c2f419544a88537f7ff4e32ed744ba7b44eArgyrios Kyrtzidis  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
974d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setArg(I, Reader.ReadSubExpr());
97539da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor  E->setConstructor(cast<CXXConstructorDecl>(Reader.GetDecl(Record[Idx++])));
97699a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
97739da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor  E->setElidable(Record[Idx++]);
97816006c901315fa12a108b4e571f187f4b676e426Douglas Gregor  E->setRequiresZeroInitialization(Record[Idx++]);
9793c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor  E->setConstructionKind((CXXConstructExpr::ConstructionKind)Record[Idx++]);
98039da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor}
9814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
98260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {
9836d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  VisitCXXConstructExpr(E);
984ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  E->Type = Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx);
9856d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  E->RParenLoc = Reader.ReadSourceLocation(Record, Idx);
9866d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis}
9876d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis
98860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
989919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  VisitExplicitCastExpr(E);
990ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig  E->setOperatorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
991ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
992ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
99360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
994ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig  return VisitCXXNamedCastExpr(E);
995ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
996ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
99760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
998ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig  return VisitCXXNamedCastExpr(E);
999ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
1000ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
100160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) {
1002ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig  return VisitCXXNamedCastExpr(E);
1003ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
1004ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
100560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
1006ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig  return VisitCXXNamedCastExpr(E);
1007ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
1008ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
100960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {
1010919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  VisitExplicitCastExpr(E);
1011ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig  E->setTypeBeginLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
1012ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
1013ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
1014ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
101560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
1016eb7f96141f754150a92433286fa385910a22f494Sam Weinig  VisitExpr(E);
1017eb7f96141f754150a92433286fa385910a22f494Sam Weinig  E->setValue(Record[Idx++]);
1018eb7f96141f754150a92433286fa385910a22f494Sam Weinig  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
1019eb7f96141f754150a92433286fa385910a22f494Sam Weinig}
1020eb7f96141f754150a92433286fa385910a22f494Sam Weinig
102160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
1022eb7f96141f754150a92433286fa385910a22f494Sam Weinig  VisitExpr(E);
1023eb7f96141f754150a92433286fa385910a22f494Sam Weinig  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
1024eb7f96141f754150a92433286fa385910a22f494Sam Weinig}
1025eb7f96141f754150a92433286fa385910a22f494Sam Weinig
102660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
102714ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner  VisitExpr(E);
102814ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner  E->setSourceRange(Reader.ReadSourceRange(Record, Idx));
102914ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner  if (E->isTypeOperand()) { // typeid(int)
1030577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    E->setTypeOperandSourceInfo(
1031577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl        Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
1032919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    return;
103314ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner  }
103414ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner
103514ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner  // typeid(42+2)
1036d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setExprOperand(Reader.ReadSubExpr());
103714ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner}
103801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichetvoid ASTStmtReader::VisitCXXUuidofExpr(CXXUuidofExpr *E) {
103901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  VisitExpr(E);
104001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  E->setSourceRange(Reader.ReadSourceRange(Record, Idx));
104101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  if (E->isTypeOperand()) { // __uuidof(ComType)
104201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    E->setTypeOperandSourceInfo(
104301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet        Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
104401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    return;
104501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  }
104601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet
104701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  // __uuidof(expr)
104801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  E->setExprOperand(Reader.ReadSubExpr());
104901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet}
105014ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner
105160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXThisExpr(CXXThisExpr *E) {
10522fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner  VisitExpr(E);
10532fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
10542fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner  E->setImplicit(Record[Idx++]);
10552fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner}
10562fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner
105760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXThrowExpr(CXXThrowExpr *E) {
10582fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner  VisitExpr(E);
10592fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner  E->setThrowLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
1060d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
10612fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner}
106214ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner
106360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
1064030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner  VisitExpr(E);
10658a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis
10668a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis  assert(Record[Idx] == E->Param.getInt() && "We messed up at creation ?");
10678a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis  ++Idx; // HasOtherExprStored and SubExpr was handled during creation.
10688a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis  E->Param.setPointer(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++])));
10698a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis  E->Loc = Reader.ReadSourceLocation(Record, Idx);
1070d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner}
1071d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner
107260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
1073d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner  VisitExpr(E);
1074d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner  E->setTemporary(Reader.ReadCXXTemporary(Record, Idx));
1075d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
1076d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner}
1077d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner
107860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
10795921863d8f24084797863b5df37842113bac4352Chris Lattner  VisitExpr(E);
1080ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  E->TypeInfo = Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx);
1081ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  E->RParenLoc = SourceLocation::getFromRawEncoding(Record[Idx++]);
10825921863d8f24084797863b5df37842113bac4352Chris Lattner}
10835921863d8f24084797863b5df37842113bac4352Chris Lattner
108460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXNewExpr(CXXNewExpr *E) {
10855921863d8f24084797863b5df37842113bac4352Chris Lattner  VisitExpr(E);
10865921863d8f24084797863b5df37842113bac4352Chris Lattner  E->setGlobalNew(Record[Idx++]);
10875921863d8f24084797863b5df37842113bac4352Chris Lattner  E->setHasInitializer(Record[Idx++]);
10885921863d8f24084797863b5df37842113bac4352Chris Lattner  bool isArray = Record[Idx++];
10895921863d8f24084797863b5df37842113bac4352Chris Lattner  unsigned NumPlacementArgs = Record[Idx++];
10905921863d8f24084797863b5df37842113bac4352Chris Lattner  unsigned NumCtorArgs = Record[Idx++];
10915921863d8f24084797863b5df37842113bac4352Chris Lattner  E->setOperatorNew(cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++])));
10925921863d8f24084797863b5df37842113bac4352Chris Lattner  E->setOperatorDelete(
10935921863d8f24084797863b5df37842113bac4352Chris Lattner                    cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++])));
10945921863d8f24084797863b5df37842113bac4352Chris Lattner  E->setConstructor(
10955921863d8f24084797863b5df37842113bac4352Chris Lattner               cast_or_null<CXXConstructorDecl>(Reader.GetDecl(Record[Idx++])));
10961bb2a93ab7b1499dda6f6b58865bd0dce1864228Douglas Gregor  E->AllocatedTypeInfo = Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx);
10974bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor  SourceRange TypeIdParens;
10984bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor  TypeIdParens.setBegin(SourceLocation::getFromRawEncoding(Record[Idx++]));
10994bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor  TypeIdParens.setEnd(SourceLocation::getFromRawEncoding(Record[Idx++]));
11004bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor  E->TypeIdParens = TypeIdParens;
11015921863d8f24084797863b5df37842113bac4352Chris Lattner  E->setStartLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
11025921863d8f24084797863b5df37842113bac4352Chris Lattner  E->setEndLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
11035921863d8f24084797863b5df37842113bac4352Chris Lattner
11045921863d8f24084797863b5df37842113bac4352Chris Lattner  E->AllocateArgsArray(*Reader.getContext(), isArray, NumPlacementArgs,
11055921863d8f24084797863b5df37842113bac4352Chris Lattner                       NumCtorArgs);
11065921863d8f24084797863b5df37842113bac4352Chris Lattner
11075921863d8f24084797863b5df37842113bac4352Chris Lattner  // Install all the subexpressions.
11085921863d8f24084797863b5df37842113bac4352Chris Lattner  for (CXXNewExpr::raw_arg_iterator I = E->raw_arg_begin(),e = E->raw_arg_end();
11095921863d8f24084797863b5df37842113bac4352Chris Lattner       I != e; ++I)
1110d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    *I = Reader.ReadSubStmt();
11115921863d8f24084797863b5df37842113bac4352Chris Lattner}
11125921863d8f24084797863b5df37842113bac4352Chris Lattner
111360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
111495fc98ce95d4faa4f1bb2783384150530404ea6fArgyrios Kyrtzidis  VisitExpr(E);
1115f1b8911d35bb2830a13267581d3cbde4b6b85db6Argyrios Kyrtzidis  E->GlobalDelete = Record[Idx++];
1116f1b8911d35bb2830a13267581d3cbde4b6b85db6Argyrios Kyrtzidis  E->ArrayForm = Record[Idx++];
11174076dacf1497fb95cb298b9d964fbdbdaf9bde6cArgyrios Kyrtzidis  E->ArrayFormAsWritten = Record[Idx++];
1118f1b8911d35bb2830a13267581d3cbde4b6b85db6Argyrios Kyrtzidis  E->OperatorDelete = cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++]));
1119f1b8911d35bb2830a13267581d3cbde4b6b85db6Argyrios Kyrtzidis  E->Argument = Reader.ReadSubExpr();
1120f1b8911d35bb2830a13267581d3cbde4b6b85db6Argyrios Kyrtzidis  E->Loc = Reader.ReadSourceLocation(Record, Idx);
112195fc98ce95d4faa4f1bb2783384150530404ea6fArgyrios Kyrtzidis}
1122d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner
112360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
1124de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  VisitExpr(E);
1125de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis
1126d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
1127de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  E->setArrow(Record[Idx++]);
1128de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  E->setOperatorLoc(Reader.ReadSourceLocation(Record, Idx));
1129de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  E->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx));
1130de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  E->setQualifierRange(Reader.ReadSourceRange(Record, Idx));
1131577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  E->setScopeTypeInfo(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
1132de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  E->setColonColonLoc(Reader.ReadSourceLocation(Record, Idx));
1133de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  E->setTildeLoc(Reader.ReadSourceLocation(Record, Idx));
1134de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis
1135de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  IdentifierInfo *II = Reader.GetIdentifierInfo(Record, Idx);
1136de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  if (II)
1137de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis    E->setDestroyedType(II, Reader.ReadSourceLocation(Record, Idx));
1138de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  else
1139577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    E->setDestroyedType(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
1140de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis}
1141de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis
114260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E) {
1143d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner  VisitExpr(E);
1144d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner  unsigned NumTemps = Record[Idx++];
1145d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner  if (NumTemps) {
1146d04ed416be7c55bddddab1fa3fd38a0113a6b3daTed Kremenek    E->setNumTemporaries(*Reader.getContext(), NumTemps);
1147d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner    for (unsigned i = 0; i != NumTemps; ++i)
1148d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner      E->setTemporary(i, Reader.ReadCXXTemporary(Record, Idx));
1149d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner  }
1150d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
1151030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner}
1152030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner
1153919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidisvoid
115460adf4acf40b72227740bf966fb87eebddff3f37Sebastian RedlASTStmtReader::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){
11558dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  VisitExpr(E);
11568dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
11578dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  unsigned NumTemplateArgs = Record[Idx++];
11588dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  assert((NumTemplateArgs != 0) == E->hasExplicitTemplateArgs() &&
11598dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis         "Read wrong record during creation ?");
116036c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis  if (E->hasExplicitTemplateArgs())
1161096832c5ed5b9106fa177ebc148489760c3bc496John McCall    ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),
1162919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis                                     NumTemplateArgs);
11638dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
1164d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
11658dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setBaseType(Reader.GetType(Record[Idx++]));
11668dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setArrow(Record[Idx++]);
11678dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setOperatorLoc(Reader.ReadSourceLocation(Record, Idx));
11688dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx));
11698dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setQualifierRange(Reader.ReadSourceRange(Record, Idx));
11708dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setFirstQualifierFoundInScope(
11718dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis                        cast_or_null<NamedDecl>(Reader.GetDecl(Record[Idx++])));
11722577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  // FIXME: read whole DeclarationNameInfo.
11738dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setMember(Reader.ReadDeclarationName(Record, Idx));
11748dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setMemberLoc(Reader.ReadSourceLocation(Record, Idx));
11758dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis}
11768dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
1177919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidisvoid
117860adf4acf40b72227740bf966fb87eebddff3f37Sebastian RedlASTStmtReader::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
117912dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis  VisitExpr(E);
118012dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis
118112dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis  unsigned NumTemplateArgs = Record[Idx++];
118212dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis  assert((NumTemplateArgs != 0) == E->hasExplicitTemplateArgs() &&
118312dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis         "Read wrong record during creation ?");
118412dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis  if (E->hasExplicitTemplateArgs())
1185919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),
1186919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis                                     NumTemplateArgs);
118712dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis
11882577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  // FIXME: read whole DeclarationNameInfo.
118912dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis  E->setDeclName(Reader.ReadDeclarationName(Record, Idx));
119012dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis  E->setLocation(Reader.ReadSourceLocation(Record, Idx));
119112dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis  E->setQualifierRange(Reader.ReadSourceRange(Record, Idx));
119212dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis  E->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx));
119312dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis}
119412dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis
1195919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidisvoid
119660adf4acf40b72227740bf966fb87eebddff3f37Sebastian RedlASTStmtReader::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {
11978dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  VisitExpr(E);
11988dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  assert(Record[Idx] == E->arg_size() && "Read wrong record during creation ?");
11998dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  ++Idx; // NumArgs;
12008dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  for (unsigned I = 0, N = E->arg_size(); I != N; ++I)
1201d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setArg(I, Reader.ReadSubExpr());
1202ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  E->Type = Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx);
12038dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setLParenLoc(Reader.ReadSourceLocation(Record, Idx));
12048dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setRParenLoc(Reader.ReadSourceLocation(Record, Idx));
12058dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis}
12068dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
120760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitOverloadExpr(OverloadExpr *E) {
1208a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  VisitExpr(E);
1209a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
1210a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  unsigned NumTemplateArgs = Record[Idx++];
1211a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  assert((NumTemplateArgs != 0) == E->hasExplicitTemplateArgs() &&
1212a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis         "Read wrong record during creation ?");
1213919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  if (E->hasExplicitTemplateArgs())
1214919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),
1215919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis                                     NumTemplateArgs);
1216a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
1217a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  unsigned NumDecls = Record[Idx++];
1218a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  UnresolvedSet<8> Decls;
1219a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  for (unsigned i = 0; i != NumDecls; ++i) {
1220a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis    NamedDecl *D = cast<NamedDecl>(Reader.GetDecl(Record[Idx++]));
1221a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis    AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
1222a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis    Decls.addDecl(D, AS);
1223a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  }
1224a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  E->initializeResults(*Reader.getContext(), Decls.begin(), Decls.end());
1225a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
12262577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  // FIXME: read whole DeclarationNameInfo.
1227a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  E->setName(Reader.ReadDeclarationName(Record, Idx));
1228a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  E->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx));
1229a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  E->setQualifierRange(Reader.ReadSourceRange(Record, Idx));
1230a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  E->setNameLoc(Reader.ReadSourceLocation(Record, Idx));
1231a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis}
1232a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
123360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
1234919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  VisitOverloadExpr(E);
1235a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  E->setArrow(Record[Idx++]);
1236a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  E->setHasUnresolvedUsing(Record[Idx++]);
1237d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
1238a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  E->setBaseType(Reader.GetType(Record[Idx++]));
1239a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  E->setOperatorLoc(Reader.ReadSourceLocation(Record, Idx));
1240a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis}
1241a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
124260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {
1243919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  VisitOverloadExpr(E);
1244bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis  E->setRequiresADL(Record[Idx++]);
1245bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis  E->setOverloaded(Record[Idx++]);
1246bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis  E->setNamingClass(cast_or_null<CXXRecordDecl>(Reader.GetDecl(Record[Idx++])));
1247bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis}
1248bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis
124960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
12506d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  VisitExpr(E);
12516d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  E->UTT = (UnaryTypeTrait)Record[Idx++];
12520dfd848fa4c9664852ba8c929a8bd3fce93ddca2Sebastian Redl  E->Value = (bool)Record[Idx++];
12536d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  SourceRange Range = Reader.ReadSourceRange(Record, Idx);
12546d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  E->Loc = Range.getBegin();
12556d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  E->RParen = Range.getEnd();
12563d37c0ada0e46b87be0a10e8d52d990a97d3907aDouglas Gregor  E->QueriedType = Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx);
12576d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis}
12586d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis
12596b219d082434394c1ac401390ec1d1967727815aSebastian Redlvoid ASTStmtReader::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
12606b219d082434394c1ac401390ec1d1967727815aSebastian Redl  VisitExpr(E);
12615221d8f2da008689f7ff9476e6522bb2b63ec1a3Sebastian Redl  E->Value = (bool)Record[Idx++];
12625221d8f2da008689f7ff9476e6522bb2b63ec1a3Sebastian Redl  E->Range = Reader.ReadSourceRange(Record, Idx);
12635221d8f2da008689f7ff9476e6522bb2b63ec1a3Sebastian Redl  E->Operand = Reader.ReadSubExpr();
12646b219d082434394c1ac401390ec1d1967727815aSebastian Redl}
12656b219d082434394c1ac401390ec1d1967727815aSebastian Redl
1266c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlStmt *ASTReader::ReadStmt(llvm::BitstreamCursor &Cursor) {
1267919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  switch (ReadingKind) {
1268919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  case Read_Decl:
1269919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  case Read_Type:
1270577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    return ReadStmtFromStream(Cursor);
1271919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  case Read_Stmt:
1272d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    return ReadSubStmt();
1273919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  }
1274919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
1275919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  llvm_unreachable("ReadingKind not set ?");
1276919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  return 0;
1277919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis}
1278919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
1279c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlExpr *ASTReader::ReadExpr(llvm::BitstreamCursor &Cursor) {
1280577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  return cast_or_null<Expr>(ReadStmt(Cursor));
1281919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis}
1282030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner
1283c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlExpr *ASTReader::ReadSubExpr() {
1284d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  return cast_or_null<Expr>(ReadSubStmt());
1285d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis}
1286d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis
128752e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner// Within the bitstream, expressions are stored in Reverse Polish
128852e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner// Notation, with each of the subexpressions preceding the
1289919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis// expression they are stored in. Subexpressions are stored from last to first.
1290919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis// To evaluate expressions, we continue reading expressions and placing them on
1291919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis// the stack, with expressions having operands removing those operands from the
129252e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner// stack. Evaluation terminates when we see a STMT_STOP record, and
129352e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner// the single remaining expression on the stack is our result.
1294c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlStmt *ASTReader::ReadStmtFromStream(llvm::BitstreamCursor &Cursor) {
1295919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
1296919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  ReadingKindTracker ReadingKind(Read_Stmt, *this);
1297919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
1298919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis#ifndef NDEBUG
1299919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  unsigned PrevNumStmts = StmtStack.size();
1300919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis#endif
1301919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
13024c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  RecordData Record;
13034c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned Idx;
130460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl  ASTStmtReader Reader(*this, Cursor, Record, Idx);
13054c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  Stmt::EmptyShell Empty;
13064c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  while (true) {
130852e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner    unsigned Code = Cursor.ReadCode();
13094c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    if (Code == llvm::bitc::END_BLOCK) {
131052e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner      if (Cursor.ReadBlockEnd()) {
13113c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl        Error("error at end of block in AST file");
13124c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        return 0;
13134c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      }
13144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13154c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
13164c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13174c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    if (Code == llvm::bitc::ENTER_SUBBLOCK) {
13184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      // No known subblocks, always skip them.
131952e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner      Cursor.ReadSubBlockID();
132052e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner      if (Cursor.SkipBlock()) {
13213c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl        Error("malformed block record in AST file");
13224c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        return 0;
13234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      }
13244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      continue;
13254c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
13264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    if (Code == llvm::bitc::DEFINE_ABBREV) {
132852e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner      Cursor.ReadAbbrevRecord();
13294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      continue;
13304c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
13314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    Stmt *S = 0;
13334c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    Idx = 0;
13344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    Record.clear();
13354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    bool Finished = false;
13368538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    switch ((StmtCode)Cursor.ReadRecord(Code, Record)) {
13378538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_STOP:
13384c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      Finished = true;
13394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13418538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_NULL_PTR:
13421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      S = 0;
13434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13444c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13458538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_NULL:
13464c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) NullStmt(Empty);
13474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13498538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_COMPOUND:
13504c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) CompoundStmt(Empty);
13514c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13524c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13538538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_CASE:
13544c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) CaseStmt(Empty);
13554c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13564c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13578538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_DEFAULT:
13584c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) DefaultStmt(Empty);
13594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13604c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13618538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_LABEL:
13624c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) LabelStmt(Empty);
13634c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13644c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13658538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_IF:
13664c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) IfStmt(Empty);
13674c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13684c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13698538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_SWITCH:
13704c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) SwitchStmt(Empty);
13714c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13724c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13738538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_WHILE:
13744c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) WhileStmt(Empty);
13754c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13778538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_DO:
13784c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) DoStmt(Empty);
13794c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
13818538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_FOR:
13824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ForStmt(Empty);
13834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13858538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_GOTO:
13864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) GotoStmt(Empty);
13874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
13898538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_INDIRECT_GOTO:
13904c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) IndirectGotoStmt(Empty);
13914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13924c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13938538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_CONTINUE:
13944c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ContinueStmt(Empty);
13954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13964c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13978538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_BREAK:
13984c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) BreakStmt(Empty);
13994c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14004c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14018538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_RETURN:
14024c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ReturnStmt(Empty);
14034c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14044c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14058538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_DECL:
14064c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) DeclStmt(Empty);
14074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14084c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14098538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_ASM:
14104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) AsmStmt(Empty);
14114c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14124c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14138538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_PREDEFINED:
14144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) PredefinedExpr(Empty);
14154c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
14178538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_DECL_REF:
1418663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      S = DeclRefExpr::CreateEmpty(*Context,
141960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                         /*HasQualifier=*/Record[ASTStmtReader::NumExprFields],
142060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                  /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields + 1]);
14214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
14238538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_INTEGER_LITERAL:
14249996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis      S = IntegerLiteral::Create(*Context, Empty);
14254c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
14278538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_FLOATING_LITERAL:
14289996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis      S = FloatingLiteral::Create(*Context, Empty);
14294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
14318538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_IMAGINARY_LITERAL:
14324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ImaginaryLiteral(Empty);
14334c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14358538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_STRING_LITERAL:
14361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      S = StringLiteral::CreateEmpty(*Context,
143760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                     Record[ASTStmtReader::NumExprFields + 1]);
14384c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14408538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CHARACTER_LITERAL:
14414c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) CharacterLiteral(Empty);
14424c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14448538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_PAREN:
14454c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ParenExpr(Empty);
14464c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14488538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_PAREN_LIST:
144937bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis      S = new (Context) ParenListExpr(Empty);
145037bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis      break;
145137bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis
14528538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_UNARY_OPERATOR:
14534c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) UnaryOperator(Empty);
14544c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14554c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14568538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OFFSETOF:
14578ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      S = OffsetOfExpr::CreateEmpty(*Context,
145860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                    Record[ASTStmtReader::NumExprFields],
145960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                    Record[ASTStmtReader::NumExprFields + 1]);
14608ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
14618ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
14628538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_SIZEOF_ALIGN_OF:
14634c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) SizeOfAlignOfExpr(Empty);
14644c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14654c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14668538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_ARRAY_SUBSCRIPT:
14674c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ArraySubscriptExpr(Empty);
14684c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14694c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14708538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CALL:
1471ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis      S = new (Context) CallExpr(*Context, Stmt::CallExprClass, Empty);
14724c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14734c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14748538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_MEMBER: {
1475663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      // We load everything here and fully initialize it at creation.
1476663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      // That way we can use MemberExpr::Create and don't have to duplicate its
1477663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      // logic with a MemberExpr::CreateEmpty.
1478663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
1479663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      assert(Idx == 0);
1480663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      NestedNameSpecifier *NNS = 0;
1481663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      SourceRange QualifierRange;
1482663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      if (Record[Idx++]) { // HasQualifier.
1483663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis        NNS = ReadNestedNameSpecifier(Record, Idx);
1484663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis        QualifierRange = ReadSourceRange(Record, Idx);
1485663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      }
1486663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
1487663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      TemplateArgumentListInfo ArgInfo;
1488663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      unsigned NumTemplateArgs = Record[Idx++];
1489663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      if (NumTemplateArgs) {
1490663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis        ArgInfo.setLAngleLoc(ReadSourceLocation(Record, Idx));
1491663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis        ArgInfo.setRAngleLoc(ReadSourceLocation(Record, Idx));
1492663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis        for (unsigned i = 0; i != NumTemplateArgs; ++i)
1493577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl          ArgInfo.addArgument(ReadTemplateArgumentLoc(Cursor, Record, Idx));
1494663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      }
1495663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
1496663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      NamedDecl *FoundD = cast_or_null<NamedDecl>(GetDecl(Record[Idx++]));
1497663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
1498663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      DeclAccessPair FoundDecl = DeclAccessPair::make(FoundD, AS);
1499663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
1500663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      QualType T = GetType(Record[Idx++]);
1501663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      Expr *Base = ReadSubExpr();
1502663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      ValueDecl *MemberD = cast<ValueDecl>(GetDecl(Record[Idx++]));
15032577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      // FIXME: read DeclarationNameLoc.
1504663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      SourceLocation MemberLoc = ReadSourceLocation(Record, Idx);
15052577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      DeclarationNameInfo MemberNameInfo(MemberD->getDeclName(), MemberLoc);
1506663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      bool IsArrow = Record[Idx++];
1507663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
1508663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      S = MemberExpr::Create(*Context, Base, IsArrow, NNS, QualifierRange,
15092577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                             MemberD, FoundDecl, MemberNameInfo,
1510663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis                             NumTemplateArgs ? &ArgInfo : 0, T);
15114c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
1512663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis    }
15134c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15148538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_BINARY_OPERATOR:
15154c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) BinaryOperator(Empty);
15164c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15174c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15188538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_COMPOUND_ASSIGN_OPERATOR:
15194c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) CompoundAssignOperator(Empty);
15204c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15228538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CONDITIONAL_OPERATOR:
15234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ConditionalOperator(Empty);
15244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15254c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15268538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_IMPLICIT_CAST:
1527f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      S = ImplicitCastExpr::CreateEmpty(*Context,
152860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
15294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15304c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15318538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CSTYLE_CAST:
1532f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      S = CStyleCastExpr::CreateEmpty(*Context,
153360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
15344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15368538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_COMPOUND_LITERAL:
15374c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) CompoundLiteralExpr(Empty);
15384c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15408538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_EXT_VECTOR_ELEMENT:
15414c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ExtVectorElementExpr(Empty);
15424c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15448538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_INIT_LIST:
1545709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek      S = new (Context) InitListExpr(*getContext(), Empty);
15464c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15488538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_DESIGNATED_INIT:
1549d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner      S = DesignatedInitExpr::CreateEmpty(*Context,
155060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                     Record[ASTStmtReader::NumExprFields] - 1);
15511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15524c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15534c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15548538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_IMPLICIT_VALUE_INIT:
15554c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ImplicitValueInitExpr(Empty);
15564c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15574c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15588538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_VA_ARG:
15594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) VAArgExpr(Empty);
15604c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15614c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15628538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_ADDR_LABEL:
15634c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) AddrLabelExpr(Empty);
15644c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15654c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15668538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_STMT:
15674c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) StmtExpr(Empty);
15684c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15694c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15708538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_TYPES_COMPATIBLE:
15714c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) TypesCompatibleExpr(Empty);
15724c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15734c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15748538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CHOOSE:
15754c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ChooseExpr(Empty);
15764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15774c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15788538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_GNU_NULL:
15794c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) GNUNullExpr(Empty);
15804c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15828538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_SHUFFLE_VECTOR:
15834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ShuffleVectorExpr(Empty);
15844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15868538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_BLOCK:
15874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) BlockExpr(Empty);
15884c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15908538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_BLOCK_DECL_REF:
15914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) BlockDeclRefExpr(Empty);
15924c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15948538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_STRING_LITERAL:
15954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCStringLiteral(Empty);
15964c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15978538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_ENCODE:
15984c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCEncodeExpr(Empty);
15994c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16008538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_SELECTOR_EXPR:
16014c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCSelectorExpr(Empty);
16024c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16038538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_PROTOCOL_EXPR:
16044c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCProtocolExpr(Empty);
16054c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16068538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_IVAR_REF_EXPR:
16074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCIvarRefExpr(Empty);
16084c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16098538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_PROPERTY_REF_EXPR:
16104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCPropertyRefExpr(Empty);
16114c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16128538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_KVC_REF_EXPR:
161309105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian      S = new (Context) ObjCImplicitSetterGetterRefExpr(Empty);
16144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16158538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_MESSAGE_EXPR:
161604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor      S = ObjCMessageExpr::CreateEmpty(*Context,
161760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                     Record[ASTStmtReader::NumExprFields]);
16184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16198538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_SUPER_EXPR:
16204c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCSuperExpr(Empty);
16214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16228538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_ISA:
1623f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff      S = new (Context) ObjCIsaExpr(Empty);
1624f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff      break;
16258538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_FOR_COLLECTION:
16264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCForCollectionStmt(Empty);
16274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16288538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_CATCH:
16294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCAtCatchStmt(Empty);
16304c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16318538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_FINALLY:
16324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCAtFinallyStmt(Empty);
16334c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16348538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_AT_TRY:
16358f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor      S = ObjCAtTryStmt::CreateEmpty(*Context,
163660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                     Record[ASTStmtReader::NumStmtFields],
163760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                     Record[ASTStmtReader::NumStmtFields + 1]);
16384c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16398538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_AT_SYNCHRONIZED:
16404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCAtSynchronizedStmt(Empty);
16414c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16428538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_AT_THROW:
16434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCAtThrowStmt(Empty);
16444c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16468538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_CXX_CATCH:
16477cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis      S = new (Context) CXXCatchStmt(Empty);
16487cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis      break;
16497cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis
16508538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_CXX_TRY:
16517cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis      S = CXXTryStmt::Create(*Context, Empty,
165260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl             /*NumHandlers=*/Record[ASTStmtReader::NumStmtFields]);
16537cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis      break;
16547cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis
16558538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_OPERATOR_CALL:
1656ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis      S = new (Context) CXXOperatorCallExpr(*Context, Empty);
1657ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis      break;
16581817bd483b538fd3f4530649f5cb900bad9e8a76Chris Lattner
16598538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_MEMBER_CALL:
16601817bd483b538fd3f4530649f5cb900bad9e8a76Chris Lattner      S = new (Context) CXXMemberCallExpr(*Context, Empty);
16611817bd483b538fd3f4530649f5cb900bad9e8a76Chris Lattner      break;
166239da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor
16638538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_CONSTRUCT:
16646d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis      S = new (Context) CXXConstructExpr(Empty);
16656d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis      break;
16666d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis
16678538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_TEMPORARY_OBJECT:
16686d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis      S = new (Context) CXXTemporaryObjectExpr(Empty);
166939da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor      break;
1670ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
16718538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_STATIC_CAST:
1672f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      S = CXXStaticCastExpr::CreateEmpty(*Context,
167360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1674ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig      break;
1675ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
16768538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_DYNAMIC_CAST:
1677f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      S = CXXDynamicCastExpr::CreateEmpty(*Context,
167860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1679ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig      break;
1680ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
16818538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_REINTERPRET_CAST:
1682f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      S = CXXReinterpretCastExpr::CreateEmpty(*Context,
168360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1684ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig      break;
1685ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
16868538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_CONST_CAST:
1687f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      S = CXXConstCastExpr::CreateEmpty(*Context);
1688ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig      break;
1689ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
16908538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_FUNCTIONAL_CAST:
1691f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      S = CXXFunctionalCastExpr::CreateEmpty(*Context,
169260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1693ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig      break;
1694ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
16958538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_BOOL_LITERAL:
1696eb7f96141f754150a92433286fa385910a22f494Sam Weinig      S = new (Context) CXXBoolLiteralExpr(Empty);
1697eb7f96141f754150a92433286fa385910a22f494Sam Weinig      break;
1698ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
16998538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_NULL_PTR_LITERAL:
1700eb7f96141f754150a92433286fa385910a22f494Sam Weinig      S = new (Context) CXXNullPtrLiteralExpr(Empty);
1701eb7f96141f754150a92433286fa385910a22f494Sam Weinig      break;
17028538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_TYPEID_EXPR:
170314ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner      S = new (Context) CXXTypeidExpr(Empty, true);
170414ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner      break;
17058538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_TYPEID_TYPE:
170614ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner      S = new (Context) CXXTypeidExpr(Empty, false);
170714ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner      break;
170801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    case EXPR_CXX_UUIDOF_EXPR:
170901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet      S = new (Context) CXXUuidofExpr(Empty, true);
171001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet      break;
171101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    case EXPR_CXX_UUIDOF_TYPE:
171201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet      S = new (Context) CXXUuidofExpr(Empty, false);
171301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet      break;
17148538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_THIS:
17152fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner      S = new (Context) CXXThisExpr(Empty);
17162fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner      break;
17178538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_THROW:
17182fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner      S = new (Context) CXXThrowExpr(Empty);
17192fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner      break;
17208538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_DEFAULT_ARG: {
172160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl      bool HasOtherExprStored = Record[ASTStmtReader::NumExprFields];
17228a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis      if (HasOtherExprStored) {
17238a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis        Expr *SubExpr = ReadSubExpr();
17248a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis        S = CXXDefaultArgExpr::Create(*Context, SourceLocation(), 0, SubExpr);
17258a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis      } else
17268a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis        S = new (Context) CXXDefaultArgExpr(Empty);
1727030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner      break;
17288a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis    }
17298538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_BIND_TEMPORARY:
1730d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner      S = new (Context) CXXBindTemporaryExpr(Empty);
1731d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner      break;
1732e2ca6d4a2f41876930fbd304caa706452d2569d8Douglas Gregor
17338538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_SCALAR_VALUE_INIT:
1734ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor      S = new (Context) CXXScalarValueInitExpr(Empty);
17355921863d8f24084797863b5df37842113bac4352Chris Lattner      break;
17368538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_NEW:
17375921863d8f24084797863b5df37842113bac4352Chris Lattner      S = new (Context) CXXNewExpr(Empty);
17385921863d8f24084797863b5df37842113bac4352Chris Lattner      break;
17398538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_DELETE:
174095fc98ce95d4faa4f1bb2783384150530404ea6fArgyrios Kyrtzidis      S = new (Context) CXXDeleteExpr(Empty);
174195fc98ce95d4faa4f1bb2783384150530404ea6fArgyrios Kyrtzidis      break;
17428538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_PSEUDO_DESTRUCTOR:
1743de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis      S = new (Context) CXXPseudoDestructorExpr(Empty);
1744de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis      break;
17455921863d8f24084797863b5df37842113bac4352Chris Lattner
17468538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_EXPR_WITH_TEMPORARIES:
1747d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner      S = new (Context) CXXExprWithTemporaries(Empty);
1748d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner      break;
17498dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
17508538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_DEPENDENT_SCOPE_MEMBER:
17518dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis      S = CXXDependentScopeMemberExpr::CreateEmpty(*Context,
175260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                      /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]);
17538dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis      break;
17548dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
17558538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_DEPENDENT_SCOPE_DECL_REF:
175612dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis      S = DependentScopeDeclRefExpr::CreateEmpty(*Context,
175760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                      /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]);
175812dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis      break;
175912dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis
17608538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_UNRESOLVED_CONSTRUCT:
17618dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis      S = CXXUnresolvedConstructExpr::CreateEmpty(*Context,
176260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                              /*NumArgs=*/Record[ASTStmtReader::NumExprFields]);
1763a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis      break;
1764a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
17658538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_UNRESOLVED_MEMBER:
1766a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis      S = UnresolvedMemberExpr::CreateEmpty(*Context,
176760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                      /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]);
17688dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis      break;
1769bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis
17708538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_UNRESOLVED_LOOKUP:
1771bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis      S = UnresolvedLookupExpr::CreateEmpty(*Context,
177260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                      /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]);
1773bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis      break;
17746d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis
17758538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_UNARY_TYPE_TRAIT:
17766d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis      S = new (Context) UnaryTypeTraitExpr(Empty);
17776d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis      break;
17786b219d082434394c1ac401390ec1d1967727815aSebastian Redl
17796b219d082434394c1ac401390ec1d1967727815aSebastian Redl    case EXPR_CXX_NOEXCEPT:
17806b219d082434394c1ac401390ec1d1967727815aSebastian Redl      S = new (Context) CXXNoexceptExpr(Empty);
17816b219d082434394c1ac401390ec1d1967727815aSebastian Redl      break;
17824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
17836d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis
17844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    // We hit a STMT_STOP, so we're done with this expression.
17854c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    if (Finished)
17864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
17884c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    ++NumStatementsRead;
17894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
1790919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    if (S)
1791919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis      Reader.Visit(S);
17924c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
17934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    assert(Idx == Record.size() && "Invalid deserialization of statement");
17944c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    StmtStack.push_back(S);
17954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
1796919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
1797919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis#ifndef NDEBUG
1798919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  assert(StmtStack.size() > PrevNumStmts && "Read too many sub stmts!");
1799919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  assert(StmtStack.size() == PrevNumStmts + 1 && "Extra expressions on stack!");
1800919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis#endif
1801919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
1802919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  return StmtStack.pop_back_val();
18034c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
1804