ASTReaderStmt.cpp revision 8538e8d43a3a9bd439c987c0de37bcbf035dd391
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);
137919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCXXThisExpr(CXXThisExpr *E);
138919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCXXThrowExpr(CXXThrowExpr *E);
139919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E);
140919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E);
1416d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis    void VisitCXXBindReferenceExpr(CXXBindReferenceExpr *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);
1594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  };
1604c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
1614c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
16260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::
16336c76f0bea0d3595a25a5362225c642019cc3176Argyrios KyrtzidisReadExplicitTemplateArgumentList(ExplicitTemplateArgumentList &ArgList,
164919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis                                 unsigned NumTemplateArgs) {
16536c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis  TemplateArgumentListInfo ArgInfo;
16636c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis  ArgInfo.setLAngleLoc(Reader.ReadSourceLocation(Record, Idx));
16736c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis  ArgInfo.setRAngleLoc(Reader.ReadSourceLocation(Record, Idx));
16836c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis  for (unsigned i = 0; i != NumTemplateArgs; ++i)
169577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    ArgInfo.addArgument(
170577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl        Reader.ReadTemplateArgumentLoc(DeclsCursor, Record, Idx));
17136c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis  ArgList.initializeFrom(ArgInfo);
17236c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis}
17336c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis
17460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitStmt(Stmt *S) {
1754c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  assert(Idx == NumStmtFields && "Incorrect statement field count");
1764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
1774c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
17860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitNullStmt(NullStmt *S) {
1794c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
1804c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setSemiLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
1814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
1824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
18360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCompoundStmt(CompoundStmt *S) {
1844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
185919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  llvm::SmallVector<Stmt *, 16> Stmts;
1864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned NumStmts = Record[Idx++];
187919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  while (NumStmts--)
188d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    Stmts.push_back(Reader.ReadSubStmt());
189919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  S->setStmts(*Reader.getContext(), Stmts.data(), Stmts.size());
1904c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setLBracLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
1914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setRBracLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
1924c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
1934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
19460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitSwitchCase(SwitchCase *S) {
1954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
1964c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  Reader.RecordSwitchCaseID(S, Record[Idx++]);
1974c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
1984c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
19960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCaseStmt(CaseStmt *S) {
2004c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitSwitchCase(S);
201d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setLHS(Reader.ReadSubExpr());
202d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setRHS(Reader.ReadSubExpr());
203d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setSubStmt(Reader.ReadSubStmt());
2044c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setCaseLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
205dbb26db1d426fb6caaaf1b4fa47b46d1947c12c9Douglas Gregor  S->setEllipsisLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
206dbb26db1d426fb6caaaf1b4fa47b46d1947c12c9Douglas Gregor  S->setColonLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2084c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
20960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitDefaultStmt(DefaultStmt *S) {
2104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitSwitchCase(S);
211d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setSubStmt(Reader.ReadSubStmt());
2124c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setDefaultLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
213dbb26db1d426fb6caaaf1b4fa47b46d1947c12c9Douglas Gregor  S->setColonLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2154c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
21660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitLabelStmt(LabelStmt *S) {
2174c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
2184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setID(Reader.GetIdentifierInfo(Record, Idx));
219d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setSubStmt(Reader.ReadSubStmt());
2204c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setIdentLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  Reader.RecordLabelStmt(S, Record[Idx++]);
2224c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
22460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitIfStmt(IfStmt *S) {
2254c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
22643dec6bbde2d0a16c35978983761c8b7030c8e18Douglas Gregor  S->setConditionVariable(*Reader.getContext(),
22743dec6bbde2d0a16c35978983761c8b7030c8e18Douglas Gregor                          cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
228d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCond(Reader.ReadSubExpr());
229d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setThen(Reader.ReadSubStmt());
230d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setElse(Reader.ReadSubStmt());
2314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setIfLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
232d06f6ca61062f85926eb9d409eb3d4f8afcf93c7Douglas Gregor  S->setElseLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2334c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
23560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitSwitchStmt(SwitchStmt *S) {
2364c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
23743dec6bbde2d0a16c35978983761c8b7030c8e18Douglas Gregor  S->setConditionVariable(*Reader.getContext(),
23843dec6bbde2d0a16c35978983761c8b7030c8e18Douglas Gregor                          cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
239d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCond(Reader.ReadSubExpr());
240d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setBody(Reader.ReadSubStmt());
2414c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setSwitchLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2424c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  SwitchCase *PrevSC = 0;
2434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned N = Record.size(); Idx != N; ++Idx) {
2444c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    SwitchCase *SC = Reader.getSwitchCaseWithID(Record[Idx]);
2454c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    if (PrevSC)
2464c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      PrevSC->setNextSwitchCase(SC);
2474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    else
2484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S->setSwitchCaseList(SC);
2491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
25043d9d9243329b1b75d1a6efdad9f16d6fb386b8eDouglas Gregor    // Retain this SwitchCase, since SwitchStmt::addSwitchCase() would
25143d9d9243329b1b75d1a6efdad9f16d6fb386b8eDouglas Gregor    // normally retain it (but we aren't calling addSwitchCase).
25243d9d9243329b1b75d1a6efdad9f16d6fb386b8eDouglas Gregor    SC->Retain();
2534c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    PrevSC = SC;
2544c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
2554c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2564c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
25760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitWhileStmt(WhileStmt *S) {
2584c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
25943dec6bbde2d0a16c35978983761c8b7030c8e18Douglas Gregor  S->setConditionVariable(*Reader.getContext(),
26043dec6bbde2d0a16c35978983761c8b7030c8e18Douglas Gregor                          cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
261d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCond(Reader.ReadSubExpr());
262d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setBody(Reader.ReadSubStmt());
2634c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setWhileLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2644c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2654c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
26660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitDoStmt(DoStmt *S) {
2674c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
268d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCond(Reader.ReadSubExpr());
269d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setBody(Reader.ReadSubStmt());
2704c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setDoLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2719f3ca2a7747bd47f14d7693f333103fac29a24d2Douglas Gregor  S->setWhileLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
272989135901c750af61ef012b6b0a0368be415bc46Chris Lattner  S->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2734c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2744c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
27560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitForStmt(ForStmt *S) {
2764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
277d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setInit(Reader.ReadSubStmt());
278d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCond(Reader.ReadSubExpr());
27943dec6bbde2d0a16c35978983761c8b7030c8e18Douglas Gregor  S->setConditionVariable(*Reader.getContext(),
28043dec6bbde2d0a16c35978983761c8b7030c8e18Douglas Gregor                          cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
281d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setInc(Reader.ReadSubExpr());
282d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setBody(Reader.ReadSubStmt());
2834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setForLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2845831c6a1efc47e6a19d82fe3dd25b5b8fef6979dDouglas Gregor  S->setLParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2855831c6a1efc47e6a19d82fe3dd25b5b8fef6979dDouglas Gregor  S->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
28860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitGotoStmt(GotoStmt *S) {
2894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
2904c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  Reader.SetLabelOf(S, Record[Idx++]);
2914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setGotoLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2924c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setLabelLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2944c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
29560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
2964c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
2974c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setGotoLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
2985f1b9e689fa5c101512aef99225f2afea1673449Douglas Gregor  S->setStarLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
299d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setTarget(Reader.ReadSubExpr());
3004c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3014c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
30260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitContinueStmt(ContinueStmt *S) {
3034c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
3044c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setContinueLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
3054c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3064c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
30760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitBreakStmt(BreakStmt *S) {
3084c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
3094c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setBreakLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
3104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3114c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
31260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitReturnStmt(ReturnStmt *S) {
3134c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
314d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setRetValue(Reader.ReadSubExpr());
3154c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setReturnLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
3165077c3876beeaed32280af88244e8050078619a8Douglas Gregor  S->setNRVOCandidate(cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
3174c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
31960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitDeclStmt(DeclStmt *S) {
3204c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
3214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setStartLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
3224c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setEndLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
3234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
3244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  if (Idx + 1 == Record.size()) {
3254c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    // Single declaration
3264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    S->setDeclGroup(DeclGroupRef(Reader.GetDecl(Record[Idx++])));
3274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  } else {
3284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    llvm::SmallVector<Decl *, 16> Decls;
3294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    Decls.reserve(Record.size() - Idx);
3304c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    for (unsigned N = Record.size(); Idx != N; ++Idx)
3314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      Decls.push_back(Reader.GetDecl(Record[Idx]));
332d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    S->setDeclGroup(DeclGroupRef(DeclGroup::Create(*Reader.getContext(),
33375fdb2377604e53678102076991bea345ace4692Douglas Gregor                                                   Decls.data(),
33475fdb2377604e53678102076991bea345ace4692Douglas Gregor                                                   Decls.size())));
3354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
3364c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3374c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
33860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitAsmStmt(AsmStmt *S) {
3394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
3404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned NumOutputs = Record[Idx++];
3414c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned NumInputs = Record[Idx++];
3424c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned NumClobbers = Record[Idx++];
3434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setAsmLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
3444c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
3454c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setVolatile(Record[Idx++]);
3464c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setSimple(Record[Idx++]);
3473b11fd3b52e7b88233c602407c151d07cb093e75Mike Stump  S->setMSAsm(Record[Idx++]);
3481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
349d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setAsmString(cast_or_null<StringLiteral>(Reader.ReadSubStmt()));
3504c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
3514c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  // Outputs and inputs
352ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson  llvm::SmallVector<IdentifierInfo *, 16> Names;
3534c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  llvm::SmallVector<StringLiteral*, 16> Constraints;
3544c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  llvm::SmallVector<Stmt*, 16> Exprs;
3554c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0, N = NumOutputs + NumInputs; I != N; ++I) {
356ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson    Names.push_back(Reader.GetIdentifierInfo(Record, Idx));
357d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    Constraints.push_back(cast_or_null<StringLiteral>(Reader.ReadSubStmt()));
358d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    Exprs.push_back(Reader.ReadSubStmt());
3594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
3604c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
3614c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  // Constraints
3624c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  llvm::SmallVector<StringLiteral*, 16> Clobbers;
3634c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0; I != NumClobbers; ++I)
364d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    Clobbers.push_back(cast_or_null<StringLiteral>(Reader.ReadSubStmt()));
365fdba9c069023f686e2608affde02c82131ee1cf8Anders Carlsson
366acb6bcb442936f3c14126fdd473307c17647cb84Anders Carlsson  S->setOutputsAndInputsAndClobbers(*Reader.getContext(),
367acb6bcb442936f3c14126fdd473307c17647cb84Anders Carlsson                                    Names.data(), Constraints.data(),
368fdba9c069023f686e2608affde02c82131ee1cf8Anders Carlsson                                    Exprs.data(), NumOutputs, NumInputs,
369fdba9c069023f686e2608affde02c82131ee1cf8Anders Carlsson                                    Clobbers.data(), NumClobbers);
3704c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3714c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
37260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitExpr(Expr *E) {
3734c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(E);
3744c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setType(Reader.GetType(Record[Idx++]));
3754c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setTypeDependent(Record[Idx++]);
3764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setValueDependent(Record[Idx++]);
3774c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  assert(Idx == NumExprFields && "Incorrect expression field count");
3784c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3794c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
38060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitPredefinedExpr(PredefinedExpr *E) {
3814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
3824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
3834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setIdentType((PredefinedExpr::IdentType)Record[Idx++]);
3844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3854c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
38660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitDeclRefExpr(DeclRefExpr *E) {
3874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
388663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
389663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  bool HasQualifier = Record[Idx++];
390663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  unsigned NumTemplateArgs = Record[Idx++];
391663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
392663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  E->DecoratedD.setInt((HasQualifier? DeclRefExpr::HasQualifierFlag : 0) |
393663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      (NumTemplateArgs ? DeclRefExpr::HasExplicitTemplateArgumentListFlag : 0));
394663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
395663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  if (HasQualifier) {
396663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis    E->getNameQualifier()->NNS = Reader.ReadNestedNameSpecifier(Record, Idx);
397663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis    E->getNameQualifier()->Range = Reader.ReadSourceRange(Record, Idx);
398663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  }
399663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
400663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  if (NumTemplateArgs)
401663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis    ReadExplicitTemplateArgumentList(*E->getExplicitTemplateArgumentList(),
402663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis                                     NumTemplateArgs);
403663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
404dbd872f273a8dbf22e089b3def6c09f0a460965dJohn McCall  E->setDecl(cast<ValueDecl>(Reader.GetDecl(Record[Idx++])));
4052577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  // FIXME: read DeclarationNameLoc.
406663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  E->setLocation(Reader.ReadSourceLocation(Record, Idx));
4074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4084c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
40960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitIntegerLiteral(IntegerLiteral *E) {
4104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
4114c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
4124c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setValue(Reader.ReadAPInt(Record, Idx));
4134c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
41560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitFloatingLiteral(FloatingLiteral *E) {
4164c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
4174c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setValue(Reader.ReadAPFloat(Record, Idx));
4184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setExact(Record[Idx++]);
4194c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
4204c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
42260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitImaginaryLiteral(ImaginaryLiteral *E) {
4234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
424d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
4254c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
42760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitStringLiteral(StringLiteral *E) {
4284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
4294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned Len = Record[Idx++];
4301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  assert(Record[Idx] == E->getNumConcatenated() &&
4314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner         "Wrong number of concatenated tokens!");
4324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  ++Idx;
4334c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setWide(Record[Idx++]);
4344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
4351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Read string data
436b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar  llvm::SmallString<16> Str(&Record[Idx], &Record[Idx] + Len);
437b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar  E->setString(*Reader.getContext(), Str.str());
4384c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  Idx += Len;
4394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
4404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  // Read source locations
4414c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0, N = E->getNumConcatenated(); I != N; ++I)
4424c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    E->setStrTokenLoc(I, SourceLocation::getFromRawEncoding(Record[Idx++]));
4434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4444c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
44560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCharacterLiteral(CharacterLiteral *E) {
4464c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
4474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setValue(Record[Idx++]);
4484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
4494c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setWide(Record[Idx++]);
4504c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4514c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
45260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitParenExpr(ParenExpr *E) {
4534c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
4544c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLParen(SourceLocation::getFromRawEncoding(Record[Idx++]));
4554c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParen(SourceLocation::getFromRawEncoding(Record[Idx++]));
456d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
4574c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4584c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
45960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitParenListExpr(ParenListExpr *E) {
46037bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  VisitExpr(E);
46137bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  unsigned NumExprs = Record[Idx++];
46237bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  E->Exprs = new (*Reader.getContext()) Stmt*[NumExprs];
46337bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  for (unsigned i = 0; i != NumExprs; ++i)
46437bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis    E->Exprs[i] = Reader.ReadSubStmt();
46537bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  E->NumExprs = NumExprs;
46637bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  E->LParenLoc = Reader.ReadSourceLocation(Record, Idx);
46737bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  E->RParenLoc = Reader.ReadSourceLocation(Record, Idx);
46837bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis}
46937bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis
47060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitUnaryOperator(UnaryOperator *E) {
4714c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
472d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
4734c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setOpcode((UnaryOperator::Opcode)Record[Idx++]);
4744c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setOperatorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
4754c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
47760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitOffsetOfExpr(OffsetOfExpr *E) {
4788ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  typedef OffsetOfExpr::OffsetOfNode Node;
4798ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  VisitExpr(E);
4808ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  assert(E->getNumComponents() == Record[Idx]);
4818ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  ++Idx;
4828ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  assert(E->getNumExpressions() == Record[Idx]);
4838ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  ++Idx;
4848ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  E->setOperatorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
4858ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
486577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  E->setTypeSourceInfo(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
4878ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
4888ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Node::Kind Kind = static_cast<Node::Kind>(Record[Idx++]);
4898ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    SourceLocation Start = SourceLocation::getFromRawEncoding(Record[Idx++]);
4908ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    SourceLocation End = SourceLocation::getFromRawEncoding(Record[Idx++]);
4918ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    switch (Kind) {
4928ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Array:
4938ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      E->setComponent(I, Node(Start, Record[Idx++], End));
4948ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
4958ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
4968ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Field:
4978ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      E->setComponent(I,
4988ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor             Node(Start,
4998ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                  dyn_cast_or_null<FieldDecl>(Reader.GetDecl(Record[Idx++])),
5008ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor                  End));
5018ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
5028ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
5038ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Identifier:
5048ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      E->setComponent(I, Node(Start, Reader.GetIdentifier(Record[Idx++]), End));
5058ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
506cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor
507afbf3127cbdebc7d3d8711c51b1d013afa57e849Argyrios Kyrtzidis    case Node::Base: {
508afbf3127cbdebc7d3d8711c51b1d013afa57e849Argyrios Kyrtzidis      CXXBaseSpecifier *Base = new (*Reader.getContext()) CXXBaseSpecifier();
509afbf3127cbdebc7d3d8711c51b1d013afa57e849Argyrios Kyrtzidis      *Base = Reader.ReadCXXBaseSpecifier(DeclsCursor, Record, Idx);
510afbf3127cbdebc7d3d8711c51b1d013afa57e849Argyrios Kyrtzidis      E->setComponent(I, Node(Base));
511cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      break;
5128ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
513afbf3127cbdebc7d3d8711c51b1d013afa57e849Argyrios Kyrtzidis    }
5148ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
5158ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
5168ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I)
517d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setIndexExpr(I, Reader.ReadSubExpr());
5188ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
5198ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
52060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
5214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
5224c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setSizeof(Record[Idx++]);
5234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  if (Record[Idx] == 0) {
524d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setArgument(Reader.ReadSubExpr());
5254c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    ++Idx;
5264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  } else {
527577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    E->setArgument(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
5284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
5294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setOperatorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
5304c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
5314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
53360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
5344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
535d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setLHS(Reader.ReadSubExpr());
536d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setRHS(Reader.ReadSubExpr());
5374c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRBracketLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
5384c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
54060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCallExpr(CallExpr *E) {
5414c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
542d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner  E->setNumArgs(*Reader.getContext(), Record[Idx++]);
5434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
544d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setCallee(Reader.ReadSubExpr());
5454c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
546d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setArg(I, Reader.ReadSubExpr());
5474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
54960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitMemberExpr(MemberExpr *E) {
550663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  // Don't call VisitExpr, this is fully initialized at creation.
551663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  assert(E->getStmtClass() == Stmt::MemberExprClass &&
552663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis         "It's a subclass, we must advance Idx!");
5534c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5544c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
55560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCIsaExpr(ObjCIsaExpr *E) {
556f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff  VisitExpr(E);
557d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
558f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff  E->setIsaMemberLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
559f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff  E->setArrow(Record[Idx++]);
560f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff}
561f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff
56260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCastExpr(CastExpr *E) {
5634c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
564f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  unsigned NumBaseSpecs = Record[Idx++];
565f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  assert(NumBaseSpecs == E->path_size());
566d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
567cdef2b75aa60cde1ca00e0aa3f89139ac89c6ae4Anders Carlsson  E->setCastKind((CastExpr::CastKind)Record[Idx++]);
568f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  CastExpr::path_iterator BaseI = E->path_begin();
5690745d0a648b75bd304045309276c70a755adaafbArgyrios Kyrtzidis  while (NumBaseSpecs--) {
5700745d0a648b75bd304045309276c70a755adaafbArgyrios Kyrtzidis    CXXBaseSpecifier *BaseSpec = new (*Reader.getContext()) CXXBaseSpecifier;
5715606220447c7901ba8d80147ddab893bb7949dd5Nick Lewycky    *BaseSpec = Reader.ReadCXXBaseSpecifier(DeclsCursor, Record, Idx);
572f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    *BaseI++ = BaseSpec;
5730745d0a648b75bd304045309276c70a755adaafbArgyrios Kyrtzidis  }
5744c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5754c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
57660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitBinaryOperator(BinaryOperator *E) {
5774c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
578d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setLHS(Reader.ReadSubExpr());
579d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setRHS(Reader.ReadSubExpr());
5804c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setOpcode((BinaryOperator::Opcode)Record[Idx++]);
5814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setOperatorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
5824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
58460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
5854c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitBinaryOperator(E);
5864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setComputationLHSType(Reader.GetType(Record[Idx++]));
5874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setComputationResultType(Reader.GetType(Record[Idx++]));
5884c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
59060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitConditionalOperator(ConditionalOperator *E) {
5914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
592d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setCond(Reader.ReadSubExpr());
593d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setLHS(Reader.ReadSubExpr());
594d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setRHS(Reader.ReadSubExpr());
59547e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor  E->setQuestionLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
59647e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor  E->setColonLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
5974c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5984c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
59960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitImplicitCastExpr(ImplicitCastExpr *E) {
6004c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitCastExpr(E);
601906082edf2aea1c6de2926f93a8d7121e49d2a54Sebastian Redl  E->setCategory(static_cast<ImplicitCastExpr::ResultCategory>(Record[Idx++]));
6024c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
6034c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
60460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitExplicitCastExpr(ExplicitCastExpr *E) {
6054c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitCastExpr(E);
606577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  E->setTypeInfoAsWritten(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
6074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
6084c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
60960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCStyleCastExpr(CStyleCastExpr *E) {
6104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExplicitCastExpr(E);
6114c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
6124c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
6134c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
6144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
61560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
6164c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
6174c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
618577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  E->setTypeSourceInfo(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
619d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setInitializer(Reader.ReadSubExpr());
6204c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setFileScope(Record[Idx++]);
6214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
6224c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
62360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
6244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
625d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
6264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setAccessor(Reader.GetIdentifierInfo(Record, Idx));
6274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setAccessorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
6284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
6294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
63060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitInitListExpr(InitListExpr *E) {
6314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
6324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned NumInits = Record[Idx++];
633709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek  E->reserveInits(*Reader.getContext(), NumInits);
6344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0; I != NumInits; ++I)
635d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->updateInit(*Reader.getContext(), I, Reader.ReadSubExpr());
636d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSyntacticForm(cast_or_null<InitListExpr>(Reader.ReadSubStmt()));
6374c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLBraceLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
6384c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRBraceLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
6394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setInitializedFieldInUnion(
6404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner                      cast_or_null<FieldDecl>(Reader.GetDecl(Record[Idx++])));
6414c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->sawArrayRangeDesignator(Record[Idx++]);
6424c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
6434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
64460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
6454c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  typedef DesignatedInitExpr::Designator Designator;
6464c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
6474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
6484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned NumSubExprs = Record[Idx++];
6494c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  assert(NumSubExprs == E->getNumSubExprs() && "Wrong number of subexprs");
6504c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0; I != NumSubExprs; ++I)
651d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setSubExpr(I, Reader.ReadSubExpr());
6524c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setEqualOrColonLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
6534c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setGNUSyntax(Record[Idx++]);
6544c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
6554c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  llvm::SmallVector<Designator, 4> Designators;
6564c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  while (Idx < Record.size()) {
6578538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    switch ((DesignatorTypes)Record[Idx++]) {
6588538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case DESIG_FIELD_DECL: {
6594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      FieldDecl *Field = cast<FieldDecl>(Reader.GetDecl(Record[Idx++]));
6601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      SourceLocation DotLoc
6614c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        = SourceLocation::getFromRawEncoding(Record[Idx++]);
6621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      SourceLocation FieldLoc
6634c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        = SourceLocation::getFromRawEncoding(Record[Idx++]);
6641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Designators.push_back(Designator(Field->getIdentifier(), DotLoc,
6654c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner                                       FieldLoc));
6664c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      Designators.back().setField(Field);
6674c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
6684c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
6694c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
6708538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case DESIG_FIELD_NAME: {
6714c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      const IdentifierInfo *Name = Reader.GetIdentifierInfo(Record, Idx);
6721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      SourceLocation DotLoc
6734c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        = SourceLocation::getFromRawEncoding(Record[Idx++]);
6741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      SourceLocation FieldLoc
6754c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        = SourceLocation::getFromRawEncoding(Record[Idx++]);
6764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      Designators.push_back(Designator(Name, DotLoc, FieldLoc));
6774c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
6784c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
6791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6808538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case DESIG_ARRAY: {
6814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      unsigned Index = Record[Idx++];
6824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      SourceLocation LBracketLoc
6834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        = SourceLocation::getFromRawEncoding(Record[Idx++]);
6844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      SourceLocation RBracketLoc
6854c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        = SourceLocation::getFromRawEncoding(Record[Idx++]);
6864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      Designators.push_back(Designator(Index, LBracketLoc, RBracketLoc));
6874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
6884c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
6894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
6908538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case DESIG_ARRAY_RANGE: {
6914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      unsigned Index = Record[Idx++];
6924c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      SourceLocation LBracketLoc
6934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        = SourceLocation::getFromRawEncoding(Record[Idx++]);
6944c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      SourceLocation EllipsisLoc
6954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        = SourceLocation::getFromRawEncoding(Record[Idx++]);
6964c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      SourceLocation RBracketLoc
6974c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        = SourceLocation::getFromRawEncoding(Record[Idx++]);
6984c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      Designators.push_back(Designator(Index, LBracketLoc, EllipsisLoc,
6994c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner                                       RBracketLoc));
7004c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
7014c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
7024c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
7034c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
704319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor  E->setDesignators(*Reader.getContext(),
705319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor                    Designators.data(), Designators.size());
7064c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
70860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
7094c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
7104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7114c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
71260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitVAArgExpr(VAArgExpr *E) {
7134c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
714d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
7152cad900202561cdda18ea6cc51ddbf3e20e3c23aAbramo Bagnara  E->setWrittenTypeInfo(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
7164c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setBuiltinLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7174c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7194c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
72060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitAddrLabelExpr(AddrLabelExpr *E) {
7214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
7224c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setAmpAmpLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLabelLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  Reader.SetLabelOf(E, Record[Idx++]);
7254c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
72760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitStmtExpr(StmtExpr *E) {
7284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
7294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7304c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
731d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubStmt(cast_or_null<CompoundStmt>(Reader.ReadSubStmt()));
7324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7334c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
73460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) {
7354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
7363fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara  E->setArgTInfo1(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
7373fcb73dae91be42b071cf0dde9222b7ec362146dAbramo Bagnara  E->setArgTInfo2(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
7384c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setBuiltinLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7414c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
74260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitChooseExpr(ChooseExpr *E) {
7434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
744d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setCond(Reader.ReadSubExpr());
745d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setLHS(Reader.ReadSubExpr());
746d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setRHS(Reader.ReadSubExpr());
7474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setBuiltinLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7494c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7504c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
75160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitGNUNullExpr(GNUNullExpr *E) {
7524c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
7534c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setTokenLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
7544c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7554c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
75660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
7574c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
758919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  llvm::SmallVector<Expr *, 16> Exprs;
7594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned NumExprs = Record[Idx++];
760919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  while (NumExprs--)
761d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    Exprs.push_back(Reader.ReadSubExpr());
762919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  E->setExprs(*Reader.getContext(), Exprs.data(), Exprs.size());
7634c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setBuiltinLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7644c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7654c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7664c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
76760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitBlockExpr(BlockExpr *E) {
7684c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
7694c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setBlockDecl(cast_or_null<BlockDecl>(Reader.GetDecl(Record[Idx++])));
7704c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setHasBlockDeclRefExprs(Record[Idx++]);
7714c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7724c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
77360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitBlockDeclRefExpr(BlockDeclRefExpr *E) {
7744c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
7754c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setDecl(cast<ValueDecl>(Reader.GetDecl(Record[Idx++])));
7764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
7774c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setByRef(Record[Idx++]);
7789b0b57c6f9996bfdb67248f6942dd23acfa36167Fariborz Jahanian  E->setConstQualAdded(Record[Idx++]);
779d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setCopyConstructorExpr(Reader.ReadSubExpr());
7804c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
7824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner//===----------------------------------------------------------------------===//
7834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner// Objective-C Expressions and Statements
7844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
78560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCStringLiteral(ObjCStringLiteral *E) {
7864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
787d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setString(cast<StringLiteral>(Reader.ReadSubStmt()));
7884c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setAtLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7904c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
79160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
7924c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
793577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  E->setEncodedTypeSourceInfo(Reader.GetTypeSourceInfo(DeclsCursor,Record,Idx));
7944c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setAtLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
7964c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7974c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
79860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
7994c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
8004c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setSelector(Reader.GetSelector(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::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
8064c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
8074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setProtocol(cast<ObjCProtocolDecl>(Reader.GetDecl(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::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
8134c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
8144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setDecl(cast<ObjCIvarDecl>(Reader.GetDecl(Record[Idx++])));
8154c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
816d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
8174c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setIsArrow(Record[Idx++]);
8184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setIsFreeIvar(Record[Idx++]);
8194c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8204c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
82160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
8224c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
8234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setProperty(cast<ObjCPropertyDecl>(Reader.GetDecl(Record[Idx++])));
8244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
825d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
8264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
82860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCImplicitSetterGetterRefExpr(
82909105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian                                      ObjCImplicitSetterGetterRefExpr *E) {
8304c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
8314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setGetterMethod(
8324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner                 cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++])));
8334c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setSetterMethod(
8344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner                 cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++])));
835d2ae5aa732e8587816fd7a7be911460e337c178eFariborz Jahanian  E->setInterfaceDecl(
8364c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner              cast_or_null<ObjCInterfaceDecl>(Reader.GetDecl(Record[Idx++])));
837d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
8384c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
8394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setClassLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
8404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8414c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
84260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCMessageExpr(ObjCMessageExpr *E) {
8434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
84404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  assert(Record[Idx] == E->getNumArgs());
84504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  ++Idx;
84604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  ObjCMessageExpr::ReceiverKind Kind
84704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    = static_cast<ObjCMessageExpr::ReceiverKind>(Record[Idx++]);
84804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  switch (Kind) {
84904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::Instance:
850d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setInstanceReceiver(Reader.ReadSubExpr());
85104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
85204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
85304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::Class:
854577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    E->setClassReceiver(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
85504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
85604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
85704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::SuperClass:
85804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::SuperInstance: {
85904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    QualType T = Reader.GetType(Record[Idx++]);
86004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    SourceLocation SuperLoc = SourceLocation::getFromRawEncoding(Record[Idx++]);
86104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    E->setSuper(SuperLoc, T, Kind == ObjCMessageExpr::SuperInstance);
86204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
86304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  }
8644c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
8654c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
86604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  assert(Kind == E->getReceiverKind());
86704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
86804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  if (Record[Idx++])
86904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    E->setMethodDecl(cast_or_null<ObjCMethodDecl>(Reader.GetDecl(Record[Idx++])));
87004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  else
87104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    E->setSelector(Reader.GetSelector(Record, Idx));
87204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
87304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  E->setLeftLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
87404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  E->setRightLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
87504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
8764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
877d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setArg(I, Reader.ReadSubExpr());
8784c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8794c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
88060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCSuperExpr(ObjCSuperExpr *E) {
8814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
8824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
8834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
88560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
8864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
887d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setElement(Reader.ReadSubStmt());
888d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCollection(Reader.ReadSubExpr());
889d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setBody(Reader.ReadSubStmt());
8904c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setForLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
8914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
8924c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
89460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
8954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
896d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCatchBody(Reader.ReadSubStmt());
897c00d8e18ad3d903acfeb5d05163ce90713066a3fDouglas Gregor  S->setCatchParamDecl(cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++])));
8984c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setAtCatchLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
8994c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
9004c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
9014c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
90260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
9034c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
904d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setFinallyBody(Reader.ReadSubStmt());
9054c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setAtFinallyLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
9064c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
9074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
90860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
9094c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
9108f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  assert(Record[Idx] == S->getNumCatchStmts());
9118f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  ++Idx;
9128f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  bool HasFinally = Record[Idx++];
913d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setTryBody(Reader.ReadSubStmt());
914919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I)
915d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    S->setCatchStmt(I, cast_or_null<ObjCAtCatchStmt>(Reader.ReadSubStmt()));
9168f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor
9178f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  if (HasFinally)
918d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    S->setFinallyStmt(Reader.ReadSubStmt());
9194c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setAtTryLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
9204c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
9214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
92260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {
9234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
924d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setSynchExpr(Reader.ReadSubStmt());
925d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setSynchBody(Reader.ReadSubStmt());
9264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setAtSynchronizedLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
9274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
9284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
92960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
9304c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
931d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setThrowExpr(Reader.ReadSubStmt());
9324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setThrowLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
9334c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
9344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
935ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
936ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis// C++ Expressions and Statements
9377cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
9387cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis
93960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXCatchStmt(CXXCatchStmt *S) {
9407cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  VisitStmt(S);
9417cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  S->CatchLoc = Reader.ReadSourceLocation(Record, Idx);
9427cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  S->ExceptionDecl = cast_or_null<VarDecl>(Reader.GetDecl(Record[Idx++]));
9437cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  S->HandlerBlock = Reader.ReadSubStmt();
9447cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis}
9457cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis
94660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXTryStmt(CXXTryStmt *S) {
9477cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  VisitStmt(S);
9487cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  assert(Record[Idx] == S->getNumHandlers() && "NumStmtFields is wrong ?");
9497cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  ++Idx;
9507cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  S->TryLoc = Reader.ReadSourceLocation(Record, Idx);
9517cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  S->getStmts()[0] = Reader.ReadSubStmt();
9527cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  for (unsigned i = 0, e = S->getNumHandlers(); i != e; ++i)
9537cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis    S->getStmts()[i + 1] = Reader.ReadSubStmt();
9547cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis}
955ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis
95660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
957919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  VisitCallExpr(E);
958ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis  E->setOperator((OverloadedOperatorKind)Record[Idx++]);
959ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis}
960ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis
96160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXConstructExpr(CXXConstructExpr *E) {
96239da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor  VisitExpr(E);
9636d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  E->NumArgs = Record[Idx++];
9646d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  if (E->NumArgs)
9656d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis    E->Args = new (*Reader.getContext()) Stmt*[E->NumArgs];
9665e1b7c2f419544a88537f7ff4e32ed744ba7b44eArgyrios Kyrtzidis  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
967d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setArg(I, Reader.ReadSubExpr());
96839da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor  E->setConstructor(cast<CXXConstructorDecl>(Reader.GetDecl(Record[Idx++])));
96999a2e600f9e2e51d3ce10fb6f27191677ac65b2aDouglas Gregor  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
97039da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor  E->setElidable(Record[Idx++]);
97116006c901315fa12a108b4e571f187f4b676e426Douglas Gregor  E->setRequiresZeroInitialization(Record[Idx++]);
9723c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor  E->setConstructionKind((CXXConstructExpr::ConstructionKind)Record[Idx++]);
97339da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor}
9744c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
97560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {
9766d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  VisitCXXConstructExpr(E);
9776d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  E->TyBeginLoc = Reader.ReadSourceLocation(Record, Idx);
9786d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  E->RParenLoc = Reader.ReadSourceLocation(Record, Idx);
9796d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis}
9806d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis
98160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
982919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  VisitExplicitCastExpr(E);
983ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig  E->setOperatorLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
984ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
985ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
98660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
987ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig  return VisitCXXNamedCastExpr(E);
988ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
989ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
99060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
991ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig  return VisitCXXNamedCastExpr(E);
992ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
993ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
99460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) {
995ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig  return VisitCXXNamedCastExpr(E);
996ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
997ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
99860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
999ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig  return VisitCXXNamedCastExpr(E);
1000ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
1001ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
100260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {
1003919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  VisitExplicitCastExpr(E);
1004ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig  E->setTypeBeginLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
1005ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
1006ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
1007ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
100860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
1009eb7f96141f754150a92433286fa385910a22f494Sam Weinig  VisitExpr(E);
1010eb7f96141f754150a92433286fa385910a22f494Sam Weinig  E->setValue(Record[Idx++]);
1011eb7f96141f754150a92433286fa385910a22f494Sam Weinig  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
1012eb7f96141f754150a92433286fa385910a22f494Sam Weinig}
1013eb7f96141f754150a92433286fa385910a22f494Sam Weinig
101460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
1015eb7f96141f754150a92433286fa385910a22f494Sam Weinig  VisitExpr(E);
1016eb7f96141f754150a92433286fa385910a22f494Sam Weinig  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
1017eb7f96141f754150a92433286fa385910a22f494Sam Weinig}
1018eb7f96141f754150a92433286fa385910a22f494Sam Weinig
101960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
102014ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner  VisitExpr(E);
102114ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner  E->setSourceRange(Reader.ReadSourceRange(Record, Idx));
102214ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner  if (E->isTypeOperand()) { // typeid(int)
1023577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    E->setTypeOperandSourceInfo(
1024577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl        Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
1025919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    return;
102614ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner  }
102714ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner
102814ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner  // typeid(42+2)
1029d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setExprOperand(Reader.ReadSubExpr());
103014ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner}
103114ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner
103260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXThisExpr(CXXThisExpr *E) {
10332fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner  VisitExpr(E);
10342fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner  E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
10352fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner  E->setImplicit(Record[Idx++]);
10362fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner}
10372fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner
103860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXThrowExpr(CXXThrowExpr *E) {
10392fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner  VisitExpr(E);
10402fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner  E->setThrowLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
1041d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
10422fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner}
104314ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner
104460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
1045030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner  VisitExpr(E);
10468a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis
10478a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis  assert(Record[Idx] == E->Param.getInt() && "We messed up at creation ?");
10488a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis  ++Idx; // HasOtherExprStored and SubExpr was handled during creation.
10498a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis  E->Param.setPointer(cast<ParmVarDecl>(Reader.GetDecl(Record[Idx++])));
10508a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis  E->Loc = Reader.ReadSourceLocation(Record, Idx);
1051d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner}
1052d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner
105360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
1054d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner  VisitExpr(E);
1055d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner  E->setTemporary(Reader.ReadCXXTemporary(Record, Idx));
1056d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
1057d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner}
1058d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner
105960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXBindReferenceExpr(CXXBindReferenceExpr *E) {
10606d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  VisitExpr(E);
10616d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  E->SubExpr = Reader.ReadSubExpr();
10626d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  E->ExtendsLifetime = Record[Idx++];
10636d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  E->RequiresTemporaryCopy = Record[Idx++];
10646d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis}
10656d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis
106660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
10675921863d8f24084797863b5df37842113bac4352Chris Lattner  VisitExpr(E);
10685921863d8f24084797863b5df37842113bac4352Chris Lattner  E->setTypeBeginLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
10695921863d8f24084797863b5df37842113bac4352Chris Lattner  E->setRParenLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
10705921863d8f24084797863b5df37842113bac4352Chris Lattner}
10715921863d8f24084797863b5df37842113bac4352Chris Lattner
107260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXNewExpr(CXXNewExpr *E) {
10735921863d8f24084797863b5df37842113bac4352Chris Lattner  VisitExpr(E);
10745921863d8f24084797863b5df37842113bac4352Chris Lattner  E->setGlobalNew(Record[Idx++]);
10755921863d8f24084797863b5df37842113bac4352Chris Lattner  E->setHasInitializer(Record[Idx++]);
10765921863d8f24084797863b5df37842113bac4352Chris Lattner  bool isArray = Record[Idx++];
10775921863d8f24084797863b5df37842113bac4352Chris Lattner  unsigned NumPlacementArgs = Record[Idx++];
10785921863d8f24084797863b5df37842113bac4352Chris Lattner  unsigned NumCtorArgs = Record[Idx++];
10795921863d8f24084797863b5df37842113bac4352Chris Lattner  E->setOperatorNew(cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++])));
10805921863d8f24084797863b5df37842113bac4352Chris Lattner  E->setOperatorDelete(
10815921863d8f24084797863b5df37842113bac4352Chris Lattner                    cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++])));
10825921863d8f24084797863b5df37842113bac4352Chris Lattner  E->setConstructor(
10835921863d8f24084797863b5df37842113bac4352Chris Lattner               cast_or_null<CXXConstructorDecl>(Reader.GetDecl(Record[Idx++])));
10844bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor  SourceRange TypeIdParens;
10854bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor  TypeIdParens.setBegin(SourceLocation::getFromRawEncoding(Record[Idx++]));
10864bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor  TypeIdParens.setEnd(SourceLocation::getFromRawEncoding(Record[Idx++]));
10874bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor  E->TypeIdParens = TypeIdParens;
10885921863d8f24084797863b5df37842113bac4352Chris Lattner  E->setStartLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
10895921863d8f24084797863b5df37842113bac4352Chris Lattner  E->setEndLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
10905921863d8f24084797863b5df37842113bac4352Chris Lattner
10915921863d8f24084797863b5df37842113bac4352Chris Lattner  E->AllocateArgsArray(*Reader.getContext(), isArray, NumPlacementArgs,
10925921863d8f24084797863b5df37842113bac4352Chris Lattner                       NumCtorArgs);
10935921863d8f24084797863b5df37842113bac4352Chris Lattner
10945921863d8f24084797863b5df37842113bac4352Chris Lattner  // Install all the subexpressions.
10955921863d8f24084797863b5df37842113bac4352Chris Lattner  for (CXXNewExpr::raw_arg_iterator I = E->raw_arg_begin(),e = E->raw_arg_end();
10965921863d8f24084797863b5df37842113bac4352Chris Lattner       I != e; ++I)
1097d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    *I = Reader.ReadSubStmt();
10985921863d8f24084797863b5df37842113bac4352Chris Lattner}
10995921863d8f24084797863b5df37842113bac4352Chris Lattner
110060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
110195fc98ce95d4faa4f1bb2783384150530404ea6fArgyrios Kyrtzidis  VisitExpr(E);
110295fc98ce95d4faa4f1bb2783384150530404ea6fArgyrios Kyrtzidis  E->setGlobalDelete(Record[Idx++]);
110395fc98ce95d4faa4f1bb2783384150530404ea6fArgyrios Kyrtzidis  E->setArrayForm(Record[Idx++]);
110495fc98ce95d4faa4f1bb2783384150530404ea6fArgyrios Kyrtzidis  E->setOperatorDelete(
110595fc98ce95d4faa4f1bb2783384150530404ea6fArgyrios Kyrtzidis                     cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++])));
1106d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setArgument(Reader.ReadSubExpr());
110795fc98ce95d4faa4f1bb2783384150530404ea6fArgyrios Kyrtzidis  E->setStartLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
110895fc98ce95d4faa4f1bb2783384150530404ea6fArgyrios Kyrtzidis}
1109d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner
111060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
1111de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  VisitExpr(E);
1112de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis
1113d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
1114de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  E->setArrow(Record[Idx++]);
1115de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  E->setOperatorLoc(Reader.ReadSourceLocation(Record, Idx));
1116de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  E->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx));
1117de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  E->setQualifierRange(Reader.ReadSourceRange(Record, Idx));
1118577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  E->setScopeTypeInfo(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
1119de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  E->setColonColonLoc(Reader.ReadSourceLocation(Record, Idx));
1120de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  E->setTildeLoc(Reader.ReadSourceLocation(Record, Idx));
1121de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis
1122de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  IdentifierInfo *II = Reader.GetIdentifierInfo(Record, Idx);
1123de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  if (II)
1124de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis    E->setDestroyedType(II, Reader.ReadSourceLocation(Record, Idx));
1125de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  else
1126577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    E->setDestroyedType(Reader.GetTypeSourceInfo(DeclsCursor, Record, Idx));
1127de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis}
1128de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis
112960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E) {
1130d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner  VisitExpr(E);
1131d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner  unsigned NumTemps = Record[Idx++];
1132d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner  if (NumTemps) {
1133d04ed416be7c55bddddab1fa3fd38a0113a6b3daTed Kremenek    E->setNumTemporaries(*Reader.getContext(), NumTemps);
1134d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner    for (unsigned i = 0; i != NumTemps; ++i)
1135d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner      E->setTemporary(i, Reader.ReadCXXTemporary(Record, Idx));
1136d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner  }
1137d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
1138030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner}
1139030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner
1140919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidisvoid
114160adf4acf40b72227740bf966fb87eebddff3f37Sebastian RedlASTStmtReader::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){
11428dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  VisitExpr(E);
11438dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
11448dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  unsigned NumTemplateArgs = Record[Idx++];
11458dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  assert((NumTemplateArgs != 0) == E->hasExplicitTemplateArgs() &&
11468dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis         "Read wrong record during creation ?");
114736c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis  if (E->hasExplicitTemplateArgs())
1148919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    ReadExplicitTemplateArgumentList(*E->getExplicitTemplateArgumentList(),
1149919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis                                     NumTemplateArgs);
11508dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
1151d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
11528dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setBaseType(Reader.GetType(Record[Idx++]));
11538dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setArrow(Record[Idx++]);
11548dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setOperatorLoc(Reader.ReadSourceLocation(Record, Idx));
11558dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx));
11568dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setQualifierRange(Reader.ReadSourceRange(Record, Idx));
11578dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setFirstQualifierFoundInScope(
11588dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis                        cast_or_null<NamedDecl>(Reader.GetDecl(Record[Idx++])));
11592577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  // FIXME: read whole DeclarationNameInfo.
11608dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setMember(Reader.ReadDeclarationName(Record, Idx));
11618dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setMemberLoc(Reader.ReadSourceLocation(Record, Idx));
11628dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis}
11638dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
1164919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidisvoid
116560adf4acf40b72227740bf966fb87eebddff3f37Sebastian RedlASTStmtReader::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
116612dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis  VisitExpr(E);
116712dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis
116812dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis  unsigned NumTemplateArgs = Record[Idx++];
116912dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis  assert((NumTemplateArgs != 0) == E->hasExplicitTemplateArgs() &&
117012dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis         "Read wrong record during creation ?");
117112dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis  if (E->hasExplicitTemplateArgs())
1172919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),
1173919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis                                     NumTemplateArgs);
117412dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis
11752577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  // FIXME: read whole DeclarationNameInfo.
117612dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis  E->setDeclName(Reader.ReadDeclarationName(Record, Idx));
117712dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis  E->setLocation(Reader.ReadSourceLocation(Record, Idx));
117812dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis  E->setQualifierRange(Reader.ReadSourceRange(Record, Idx));
117912dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis  E->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx));
118012dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis}
118112dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis
1182919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidisvoid
118360adf4acf40b72227740bf966fb87eebddff3f37Sebastian RedlASTStmtReader::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {
11848dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  VisitExpr(E);
11858dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  assert(Record[Idx] == E->arg_size() && "Read wrong record during creation ?");
11868dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  ++Idx; // NumArgs;
11878dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  for (unsigned I = 0, N = E->arg_size(); I != N; ++I)
1188d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setArg(I, Reader.ReadSubExpr());
11898dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setTypeBeginLoc(Reader.ReadSourceLocation(Record, Idx));
11908dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setTypeAsWritten(Reader.GetType(Record[Idx++]));
11918dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setLParenLoc(Reader.ReadSourceLocation(Record, Idx));
11928dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  E->setRParenLoc(Reader.ReadSourceLocation(Record, Idx));
11938dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis}
11948dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
119560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitOverloadExpr(OverloadExpr *E) {
1196a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  VisitExpr(E);
1197a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
1198a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  unsigned NumTemplateArgs = Record[Idx++];
1199a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  assert((NumTemplateArgs != 0) == E->hasExplicitTemplateArgs() &&
1200a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis         "Read wrong record during creation ?");
1201919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  if (E->hasExplicitTemplateArgs())
1202919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),
1203919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis                                     NumTemplateArgs);
1204a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
1205a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  unsigned NumDecls = Record[Idx++];
1206a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  UnresolvedSet<8> Decls;
1207a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  for (unsigned i = 0; i != NumDecls; ++i) {
1208a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis    NamedDecl *D = cast<NamedDecl>(Reader.GetDecl(Record[Idx++]));
1209a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis    AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
1210a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis    Decls.addDecl(D, AS);
1211a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  }
1212a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  E->initializeResults(*Reader.getContext(), Decls.begin(), Decls.end());
1213a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
12142577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  // FIXME: read whole DeclarationNameInfo.
1215a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  E->setName(Reader.ReadDeclarationName(Record, Idx));
1216a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  E->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx));
1217a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  E->setQualifierRange(Reader.ReadSourceRange(Record, Idx));
1218a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  E->setNameLoc(Reader.ReadSourceLocation(Record, Idx));
1219a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis}
1220a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
122160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
1222919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  VisitOverloadExpr(E);
1223a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  E->setArrow(Record[Idx++]);
1224a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  E->setHasUnresolvedUsing(Record[Idx++]);
1225d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
1226a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  E->setBaseType(Reader.GetType(Record[Idx++]));
1227a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  E->setOperatorLoc(Reader.ReadSourceLocation(Record, Idx));
1228a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis}
1229a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
123060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {
1231919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  VisitOverloadExpr(E);
1232bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis  E->setRequiresADL(Record[Idx++]);
1233bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis  E->setOverloaded(Record[Idx++]);
1234bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis  E->setNamingClass(cast_or_null<CXXRecordDecl>(Reader.GetDecl(Record[Idx++])));
1235bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis}
1236bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis
123760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
12386d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  VisitExpr(E);
12396d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  E->UTT = (UnaryTypeTrait)Record[Idx++];
12406d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  SourceRange Range = Reader.ReadSourceRange(Record, Idx);
12416d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  E->Loc = Range.getBegin();
12426d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  E->RParen = Range.getEnd();
12436d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  E->QueriedType = Reader.GetType(Record[Idx++]);
12446d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis}
12456d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis
1246c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlStmt *ASTReader::ReadStmt(llvm::BitstreamCursor &Cursor) {
1247919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  switch (ReadingKind) {
1248919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  case Read_Decl:
1249919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  case Read_Type:
1250577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    return ReadStmtFromStream(Cursor);
1251919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  case Read_Stmt:
1252d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    return ReadSubStmt();
1253919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  }
1254919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
1255919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  llvm_unreachable("ReadingKind not set ?");
1256919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  return 0;
1257919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis}
1258919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
1259c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlExpr *ASTReader::ReadExpr(llvm::BitstreamCursor &Cursor) {
1260577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl  return cast_or_null<Expr>(ReadStmt(Cursor));
1261919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis}
1262030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner
1263c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlExpr *ASTReader::ReadSubExpr() {
1264d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  return cast_or_null<Expr>(ReadSubStmt());
1265d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis}
1266d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis
126752e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner// Within the bitstream, expressions are stored in Reverse Polish
126852e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner// Notation, with each of the subexpressions preceding the
1269919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis// expression they are stored in. Subexpressions are stored from last to first.
1270919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis// To evaluate expressions, we continue reading expressions and placing them on
1271919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis// the stack, with expressions having operands removing those operands from the
127252e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner// stack. Evaluation terminates when we see a STMT_STOP record, and
127352e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner// the single remaining expression on the stack is our result.
1274c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlStmt *ASTReader::ReadStmtFromStream(llvm::BitstreamCursor &Cursor) {
1275919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
1276919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  ReadingKindTracker ReadingKind(Read_Stmt, *this);
1277919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
1278919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis#ifndef NDEBUG
1279919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  unsigned PrevNumStmts = StmtStack.size();
1280919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis#endif
1281919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
12824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  RecordData Record;
12834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned Idx;
128460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl  ASTStmtReader Reader(*this, Cursor, Record, Idx);
12854c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  Stmt::EmptyShell Empty;
12864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
12874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  while (true) {
128852e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner    unsigned Code = Cursor.ReadCode();
12894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    if (Code == llvm::bitc::END_BLOCK) {
129052e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner      if (Cursor.ReadBlockEnd()) {
12913c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl        Error("error at end of block in AST file");
12924c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        return 0;
12934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      }
12944c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
12954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
12964c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
12974c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    if (Code == llvm::bitc::ENTER_SUBBLOCK) {
12984c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      // No known subblocks, always skip them.
129952e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner      Cursor.ReadSubBlockID();
130052e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner      if (Cursor.SkipBlock()) {
13013c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl        Error("malformed block record in AST file");
13024c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        return 0;
13034c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      }
13044c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      continue;
13054c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
13064c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    if (Code == llvm::bitc::DEFINE_ABBREV) {
130852e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner      Cursor.ReadAbbrevRecord();
13094c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      continue;
13104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
13114c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13124c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    Stmt *S = 0;
13134c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    Idx = 0;
13144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    Record.clear();
13154c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    bool Finished = false;
13168538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    switch ((StmtCode)Cursor.ReadRecord(Code, Record)) {
13178538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_STOP:
13184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      Finished = true;
13194c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13204c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13218538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_NULL_PTR:
13221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      S = 0;
13234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13258538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_NULL:
13264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) NullStmt(Empty);
13274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13298538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_COMPOUND:
13304c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) CompoundStmt(Empty);
13314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13338538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_CASE:
13344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) CaseStmt(Empty);
13354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13364c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13378538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_DEFAULT:
13384c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) DefaultStmt(Empty);
13394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13418538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_LABEL:
13424c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) LabelStmt(Empty);
13434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13444c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13458538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_IF:
13464c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) IfStmt(Empty);
13474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13498538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_SWITCH:
13504c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) SwitchStmt(Empty);
13514c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13524c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13538538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_WHILE:
13544c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) WhileStmt(Empty);
13554c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13564c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13578538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_DO:
13584c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) DoStmt(Empty);
13594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
13618538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_FOR:
13624c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ForStmt(Empty);
13634c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13644c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13658538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_GOTO:
13664c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) GotoStmt(Empty);
13674c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
13698538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_INDIRECT_GOTO:
13704c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) IndirectGotoStmt(Empty);
13714c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13724c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13738538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_CONTINUE:
13744c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ContinueStmt(Empty);
13754c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13778538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_BREAK:
13784c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) BreakStmt(Empty);
13794c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13804c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13818538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_RETURN:
13824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ReturnStmt(Empty);
13834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13858538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_DECL:
13864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) DeclStmt(Empty);
13874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13884c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13898538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_ASM:
13904c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) AsmStmt(Empty);
13914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13924c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13938538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_PREDEFINED:
13944c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) PredefinedExpr(Empty);
13954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
13961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
13978538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_DECL_REF:
1398663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      S = DeclRefExpr::CreateEmpty(*Context,
139960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                         /*HasQualifier=*/Record[ASTStmtReader::NumExprFields],
140060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                  /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields + 1]);
14014c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
14038538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_INTEGER_LITERAL:
14044c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) IntegerLiteral(Empty);
14054c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
14078538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_FLOATING_LITERAL:
14084c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) FloatingLiteral(Empty);
14094c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
14118538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_IMAGINARY_LITERAL:
14124c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ImaginaryLiteral(Empty);
14134c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14158538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_STRING_LITERAL:
14161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      S = StringLiteral::CreateEmpty(*Context,
141760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                     Record[ASTStmtReader::NumExprFields + 1]);
14184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14194c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14208538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CHARACTER_LITERAL:
14214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) CharacterLiteral(Empty);
14224c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14248538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_PAREN:
14254c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ParenExpr(Empty);
14264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14288538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_PAREN_LIST:
142937bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis      S = new (Context) ParenListExpr(Empty);
143037bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis      break;
143137bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis
14328538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_UNARY_OPERATOR:
14334c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) UnaryOperator(Empty);
14344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14368538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OFFSETOF:
14378ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      S = OffsetOfExpr::CreateEmpty(*Context,
143860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                    Record[ASTStmtReader::NumExprFields],
143960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                    Record[ASTStmtReader::NumExprFields + 1]);
14408ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
14418ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
14428538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_SIZEOF_ALIGN_OF:
14434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) SizeOfAlignOfExpr(Empty);
14444c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14454c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14468538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_ARRAY_SUBSCRIPT:
14474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ArraySubscriptExpr(Empty);
14484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14494c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14508538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CALL:
1451ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis      S = new (Context) CallExpr(*Context, Stmt::CallExprClass, Empty);
14524c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14534c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14548538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_MEMBER: {
1455663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      // We load everything here and fully initialize it at creation.
1456663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      // That way we can use MemberExpr::Create and don't have to duplicate its
1457663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      // logic with a MemberExpr::CreateEmpty.
1458663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
1459663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      assert(Idx == 0);
1460663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      NestedNameSpecifier *NNS = 0;
1461663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      SourceRange QualifierRange;
1462663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      if (Record[Idx++]) { // HasQualifier.
1463663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis        NNS = ReadNestedNameSpecifier(Record, Idx);
1464663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis        QualifierRange = ReadSourceRange(Record, Idx);
1465663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      }
1466663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
1467663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      TemplateArgumentListInfo ArgInfo;
1468663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      unsigned NumTemplateArgs = Record[Idx++];
1469663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      if (NumTemplateArgs) {
1470663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis        ArgInfo.setLAngleLoc(ReadSourceLocation(Record, Idx));
1471663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis        ArgInfo.setRAngleLoc(ReadSourceLocation(Record, Idx));
1472663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis        for (unsigned i = 0; i != NumTemplateArgs; ++i)
1473577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl          ArgInfo.addArgument(ReadTemplateArgumentLoc(Cursor, Record, Idx));
1474663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      }
1475663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
1476663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      NamedDecl *FoundD = cast_or_null<NamedDecl>(GetDecl(Record[Idx++]));
1477663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
1478663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      DeclAccessPair FoundDecl = DeclAccessPair::make(FoundD, AS);
1479663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
1480663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      QualType T = GetType(Record[Idx++]);
1481663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      Expr *Base = ReadSubExpr();
1482663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      ValueDecl *MemberD = cast<ValueDecl>(GetDecl(Record[Idx++]));
14832577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      // FIXME: read DeclarationNameLoc.
1484663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      SourceLocation MemberLoc = ReadSourceLocation(Record, Idx);
14852577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      DeclarationNameInfo MemberNameInfo(MemberD->getDeclName(), MemberLoc);
1486663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      bool IsArrow = Record[Idx++];
1487663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
1488663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      S = MemberExpr::Create(*Context, Base, IsArrow, NNS, QualifierRange,
14892577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                             MemberD, FoundDecl, MemberNameInfo,
1490663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis                             NumTemplateArgs ? &ArgInfo : 0, T);
14914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
1492663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis    }
14934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14948538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_BINARY_OPERATOR:
14954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) BinaryOperator(Empty);
14964c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14974c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14988538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_COMPOUND_ASSIGN_OPERATOR:
14994c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) CompoundAssignOperator(Empty);
15004c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15014c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15028538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CONDITIONAL_OPERATOR:
15034c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ConditionalOperator(Empty);
15044c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15054c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15068538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_IMPLICIT_CAST:
1507f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      S = ImplicitCastExpr::CreateEmpty(*Context,
150860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
15094c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15118538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CSTYLE_CAST:
1512f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      S = CStyleCastExpr::CreateEmpty(*Context,
151360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
15144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15154c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15168538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_COMPOUND_LITERAL:
15174c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) CompoundLiteralExpr(Empty);
15184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15194c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15208538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_EXT_VECTOR_ELEMENT:
15214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ExtVectorElementExpr(Empty);
15224c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15248538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_INIT_LIST:
1525709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek      S = new (Context) InitListExpr(*getContext(), Empty);
15264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15288538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_DESIGNATED_INIT:
1529d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner      S = DesignatedInitExpr::CreateEmpty(*Context,
153060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                     Record[ASTStmtReader::NumExprFields] - 1);
15311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15334c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15348538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_IMPLICIT_VALUE_INIT:
15354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ImplicitValueInitExpr(Empty);
15364c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15374c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15388538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_VA_ARG:
15394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) VAArgExpr(Empty);
15404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15414c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15428538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_ADDR_LABEL:
15434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) AddrLabelExpr(Empty);
15444c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15454c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15468538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_STMT:
15474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) StmtExpr(Empty);
15484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15494c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15508538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_TYPES_COMPATIBLE:
15514c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) TypesCompatibleExpr(Empty);
15524c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15534c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15548538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CHOOSE:
15554c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ChooseExpr(Empty);
15564c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15574c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15588538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_GNU_NULL:
15594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) GNUNullExpr(Empty);
15604c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15614c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15628538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_SHUFFLE_VECTOR:
15634c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ShuffleVectorExpr(Empty);
15644c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15668538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_BLOCK:
15674c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) BlockExpr(Empty);
15684c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15694c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15708538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_BLOCK_DECL_REF:
15714c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) BlockDeclRefExpr(Empty);
15724c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15748538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_STRING_LITERAL:
15754c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCStringLiteral(Empty);
15764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15778538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_ENCODE:
15784c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCEncodeExpr(Empty);
15794c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15808538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_SELECTOR_EXPR:
15814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCSelectorExpr(Empty);
15824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15838538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_PROTOCOL_EXPR:
15844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCProtocolExpr(Empty);
15854c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15868538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_IVAR_REF_EXPR:
15874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCIvarRefExpr(Empty);
15884c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15898538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_PROPERTY_REF_EXPR:
15904c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCPropertyRefExpr(Empty);
15914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15928538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_KVC_REF_EXPR:
159309105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian      S = new (Context) ObjCImplicitSetterGetterRefExpr(Empty);
15944c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15958538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_MESSAGE_EXPR:
159604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor      S = ObjCMessageExpr::CreateEmpty(*Context,
159760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                     Record[ASTStmtReader::NumExprFields]);
15984c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15998538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_SUPER_EXPR:
16004c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCSuperExpr(Empty);
16014c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16028538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_ISA:
1603f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff      S = new (Context) ObjCIsaExpr(Empty);
1604f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff      break;
16058538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_FOR_COLLECTION:
16064c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCForCollectionStmt(Empty);
16074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16088538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_CATCH:
16094c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCAtCatchStmt(Empty);
16104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16118538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_FINALLY:
16124c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCAtFinallyStmt(Empty);
16134c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16148538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_AT_TRY:
16158f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor      S = ObjCAtTryStmt::CreateEmpty(*Context,
161660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                     Record[ASTStmtReader::NumStmtFields],
161760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                     Record[ASTStmtReader::NumStmtFields + 1]);
16184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16198538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_AT_SYNCHRONIZED:
16204c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCAtSynchronizedStmt(Empty);
16214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16228538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_AT_THROW:
16234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCAtThrowStmt(Empty);
16244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16268538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_CXX_CATCH:
16277cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis      S = new (Context) CXXCatchStmt(Empty);
16287cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis      break;
16297cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis
16308538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_CXX_TRY:
16317cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis      S = CXXTryStmt::Create(*Context, Empty,
163260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl             /*NumHandlers=*/Record[ASTStmtReader::NumStmtFields]);
16337cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis      break;
16347cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis
16358538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_OPERATOR_CALL:
1636ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis      S = new (Context) CXXOperatorCallExpr(*Context, Empty);
1637ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis      break;
16381817bd483b538fd3f4530649f5cb900bad9e8a76Chris Lattner
16398538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_MEMBER_CALL:
16401817bd483b538fd3f4530649f5cb900bad9e8a76Chris Lattner      S = new (Context) CXXMemberCallExpr(*Context, Empty);
16411817bd483b538fd3f4530649f5cb900bad9e8a76Chris Lattner      break;
164239da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor
16438538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_CONSTRUCT:
16446d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis      S = new (Context) CXXConstructExpr(Empty);
16456d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis      break;
16466d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis
16478538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_TEMPORARY_OBJECT:
16486d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis      S = new (Context) CXXTemporaryObjectExpr(Empty);
164939da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor      break;
1650ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
16518538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_STATIC_CAST:
1652f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      S = CXXStaticCastExpr::CreateEmpty(*Context,
165360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1654ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig      break;
1655ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
16568538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_DYNAMIC_CAST:
1657f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      S = CXXDynamicCastExpr::CreateEmpty(*Context,
165860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1659ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig      break;
1660ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
16618538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_REINTERPRET_CAST:
1662f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      S = CXXReinterpretCastExpr::CreateEmpty(*Context,
166360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1664ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig      break;
1665ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
16668538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_CONST_CAST:
1667f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      S = CXXConstCastExpr::CreateEmpty(*Context);
1668ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig      break;
1669ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
16708538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_FUNCTIONAL_CAST:
1671f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      S = CXXFunctionalCastExpr::CreateEmpty(*Context,
167260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1673ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig      break;
1674ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
16758538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_BOOL_LITERAL:
1676eb7f96141f754150a92433286fa385910a22f494Sam Weinig      S = new (Context) CXXBoolLiteralExpr(Empty);
1677eb7f96141f754150a92433286fa385910a22f494Sam Weinig      break;
1678ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
16798538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_NULL_PTR_LITERAL:
1680eb7f96141f754150a92433286fa385910a22f494Sam Weinig      S = new (Context) CXXNullPtrLiteralExpr(Empty);
1681eb7f96141f754150a92433286fa385910a22f494Sam Weinig      break;
16828538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_TYPEID_EXPR:
168314ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner      S = new (Context) CXXTypeidExpr(Empty, true);
168414ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner      break;
16858538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_TYPEID_TYPE:
168614ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner      S = new (Context) CXXTypeidExpr(Empty, false);
168714ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner      break;
16888538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_THIS:
16892fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner      S = new (Context) CXXThisExpr(Empty);
16902fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner      break;
16918538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_THROW:
16922fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner      S = new (Context) CXXThrowExpr(Empty);
16932fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner      break;
16948538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_DEFAULT_ARG: {
169560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl      bool HasOtherExprStored = Record[ASTStmtReader::NumExprFields];
16968a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis      if (HasOtherExprStored) {
16978a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis        Expr *SubExpr = ReadSubExpr();
16988a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis        S = CXXDefaultArgExpr::Create(*Context, SourceLocation(), 0, SubExpr);
16998a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis      } else
17008a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis        S = new (Context) CXXDefaultArgExpr(Empty);
1701030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner      break;
17028a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis    }
17038538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_BIND_TEMPORARY:
1704d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner      S = new (Context) CXXBindTemporaryExpr(Empty);
1705d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner      break;
17068538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_BIND_REFERENCE:
17076d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis      S = new (Context) CXXBindReferenceExpr(Empty);
17086d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis      break;
17095921863d8f24084797863b5df37842113bac4352Chris Lattner
17108538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_SCALAR_VALUE_INIT:
1711ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor      S = new (Context) CXXScalarValueInitExpr(Empty);
17125921863d8f24084797863b5df37842113bac4352Chris Lattner      break;
17138538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_NEW:
17145921863d8f24084797863b5df37842113bac4352Chris Lattner      S = new (Context) CXXNewExpr(Empty);
17155921863d8f24084797863b5df37842113bac4352Chris Lattner      break;
17168538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_DELETE:
171795fc98ce95d4faa4f1bb2783384150530404ea6fArgyrios Kyrtzidis      S = new (Context) CXXDeleteExpr(Empty);
171895fc98ce95d4faa4f1bb2783384150530404ea6fArgyrios Kyrtzidis      break;
17198538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_PSEUDO_DESTRUCTOR:
1720de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis      S = new (Context) CXXPseudoDestructorExpr(Empty);
1721de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis      break;
17225921863d8f24084797863b5df37842113bac4352Chris Lattner
17238538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_EXPR_WITH_TEMPORARIES:
1724d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner      S = new (Context) CXXExprWithTemporaries(Empty);
1725d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner      break;
17268dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
17278538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_DEPENDENT_SCOPE_MEMBER:
17288dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis      S = CXXDependentScopeMemberExpr::CreateEmpty(*Context,
172960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                      /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]);
17308dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis      break;
17318dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
17328538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_DEPENDENT_SCOPE_DECL_REF:
173312dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis      S = DependentScopeDeclRefExpr::CreateEmpty(*Context,
173460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                      /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]);
173512dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis      break;
173612dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis
17378538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_UNRESOLVED_CONSTRUCT:
17388dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis      S = CXXUnresolvedConstructExpr::CreateEmpty(*Context,
173960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                              /*NumArgs=*/Record[ASTStmtReader::NumExprFields]);
1740a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis      break;
1741a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
17428538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_UNRESOLVED_MEMBER:
1743a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis      S = UnresolvedMemberExpr::CreateEmpty(*Context,
174460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                      /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]);
17458dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis      break;
1746bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis
17478538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_UNRESOLVED_LOOKUP:
1748bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis      S = UnresolvedLookupExpr::CreateEmpty(*Context,
174960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                      /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]);
1750bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis      break;
17516d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis
17528538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_UNARY_TYPE_TRAIT:
17536d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis      S = new (Context) UnaryTypeTraitExpr(Empty);
17546d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis      break;
17554c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
17566d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis
17574c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    // We hit a STMT_STOP, so we're done with this expression.
17584c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    if (Finished)
17594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17604c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
17614c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    ++NumStatementsRead;
17624c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
1763919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    if (S)
1764919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis      Reader.Visit(S);
17654c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
17664c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    assert(Idx == Record.size() && "Invalid deserialization of statement");
17674c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    StmtStack.push_back(S);
17684c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
1769919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
1770919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis#ifndef NDEBUG
1771919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  assert(StmtStack.size() > PrevNumStmts && "Read too many sub stmts!");
1772919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  assert(StmtStack.size() == PrevNumStmts + 1 && "Extra expressions on stack!");
1773919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis#endif
1774919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
1775919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  return StmtStack.pop_back_val();
17764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
1777