ASTReaderStmt.cpp revision 5cee1195584fa8672253139c86e922daeda69b9e
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"
17c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor#include "clang/AST/DeclTemplate.h"
184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner#include "clang/AST/StmtVisitor.h"
194c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattnerusing namespace clang;
208538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlusing namespace clang::serialization;
214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
2237bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidisnamespace clang {
2317cfdeda476aa8899f0ccedd9cb9cdb76e89b6b4Argyrios Kyrtzidis
2460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl  class ASTStmtReader : public StmtVisitor<ASTStmtReader> {
25409448c832d27703146b70a1137d86b020f29863Douglas Gregor    typedef ASTReader::RecordData RecordData;
26409448c832d27703146b70a1137d86b020f29863Douglas Gregor
27c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl    ASTReader &Reader;
2872a9ae18553bf8b6bdad84d2c54f73741a47e275Douglas Gregor    Module &F;
29577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    llvm::BitstreamCursor &DeclsCursor;
30c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl    const ASTReader::RecordData &Record;
314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    unsigned &Idx;
324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
33409448c832d27703146b70a1137d86b020f29863Douglas Gregor    SourceLocation ReadSourceLocation(const RecordData &R, unsigned &I) {
34c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      return Reader.ReadSourceLocation(F, R, I);
35c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    }
36409448c832d27703146b70a1137d86b020f29863Douglas Gregor
37409448c832d27703146b70a1137d86b020f29863Douglas Gregor    SourceRange ReadSourceRange(const RecordData &R, unsigned &I) {
38c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      return Reader.ReadSourceRange(F, R, I);
39c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    }
40409448c832d27703146b70a1137d86b020f29863Douglas Gregor
41409448c832d27703146b70a1137d86b020f29863Douglas Gregor    TypeSourceInfo *GetTypeSourceInfo(const RecordData &R, unsigned &I) {
42c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      return Reader.GetTypeSourceInfo(F, R, I);
43c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    }
44409448c832d27703146b70a1137d86b020f29863Douglas Gregor
45409448c832d27703146b70a1137d86b020f29863Douglas Gregor    serialization::DeclID ReadDeclID(const RecordData &R, unsigned &I) {
46409448c832d27703146b70a1137d86b020f29863Douglas Gregor      return Reader.ReadDeclID(F, R, I);
47409448c832d27703146b70a1137d86b020f29863Douglas Gregor    }
48409448c832d27703146b70a1137d86b020f29863Douglas Gregor
49409448c832d27703146b70a1137d86b020f29863Douglas Gregor    Decl *ReadDecl(const RecordData &R, unsigned &I) {
50409448c832d27703146b70a1137d86b020f29863Douglas Gregor      return Reader.ReadDecl(F, R, I);
51409448c832d27703146b70a1137d86b020f29863Douglas Gregor    }
52409448c832d27703146b70a1137d86b020f29863Douglas Gregor
53409448c832d27703146b70a1137d86b020f29863Douglas Gregor    template<typename T>
54409448c832d27703146b70a1137d86b020f29863Douglas Gregor    T *ReadDeclAs(const RecordData &R, unsigned &I) {
55409448c832d27703146b70a1137d86b020f29863Douglas Gregor      return Reader.ReadDeclAs<T>(F, R, I);
56409448c832d27703146b70a1137d86b020f29863Douglas Gregor    }
57409448c832d27703146b70a1137d86b020f29863Douglas Gregor
584045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    void ReadDeclarationNameLoc(DeclarationNameLoc &DNLoc, DeclarationName Name,
594045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis                                const ASTReader::RecordData &R, unsigned &I) {
604045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis      Reader.ReadDeclarationNameLoc(F, DNLoc, Name, R, I);
614045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    }
62409448c832d27703146b70a1137d86b020f29863Douglas Gregor
634045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    void ReadDeclarationNameInfo(DeclarationNameInfo &NameInfo,
644045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis                                const ASTReader::RecordData &R, unsigned &I) {
654045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis      Reader.ReadDeclarationNameInfo(F, NameInfo, R, I);
664045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis    }
67c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl
684c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  public:
6972a9ae18553bf8b6bdad84d2c54f73741a47e275Douglas Gregor    ASTStmtReader(ASTReader &Reader, Module &F,
70c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl                  llvm::BitstreamCursor &Cursor,
71c43b54cbc10654ed59de797898042e1a05265246Sebastian Redl                  const ASTReader::RecordData &Record, unsigned &Idx)
72c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      : Reader(Reader), F(F), DeclsCursor(Cursor), Record(Record), Idx(Idx) { }
734c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
744c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    /// \brief The number of record fields required for the Stmt class
754c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    /// itself.
764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    static const unsigned NumStmtFields = 0;
774c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
784c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    /// \brief The number of record fields required for the Expr class
794c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    /// itself.
80561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    static const unsigned NumExprFields = NumStmtFields + 7;
8136c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis
8236c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis    /// \brief Read and initialize a ExplicitTemplateArgumentList structure.
83919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void ReadExplicitTemplateArgumentList(ExplicitTemplateArgumentList &ArgList,
84919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis                                          unsigned NumTemplateArgs);
85919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
86919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    void VisitStmt(Stmt *S);
877110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall#define STMT(Type, Base) \
887110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall    void Visit##Type(Type *);
897110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall#include "clang/AST/StmtNodes.inc"
904c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  };
914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
924c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
9360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::
9436c76f0bea0d3595a25a5362225c642019cc3176Argyrios KyrtzidisReadExplicitTemplateArgumentList(ExplicitTemplateArgumentList &ArgList,
95919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis                                 unsigned NumTemplateArgs) {
9636c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis  TemplateArgumentListInfo ArgInfo;
97c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  ArgInfo.setLAngleLoc(ReadSourceLocation(Record, Idx));
98c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  ArgInfo.setRAngleLoc(ReadSourceLocation(Record, Idx));
9936c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis  for (unsigned i = 0; i != NumTemplateArgs; ++i)
100577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    ArgInfo.addArgument(
101c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        Reader.ReadTemplateArgumentLoc(F, Record, Idx));
10236c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis  ArgList.initializeFrom(ArgInfo);
10336c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis}
10436c76f0bea0d3595a25a5362225c642019cc3176Argyrios Kyrtzidis
10560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitStmt(Stmt *S) {
1064c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  assert(Idx == NumStmtFields && "Incorrect statement field count");
1074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
1084c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
10960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitNullStmt(NullStmt *S) {
1104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
111c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setSemiLoc(ReadSourceLocation(Record, Idx));
112b7d98d35ea723624345f06e5895ddce2e0388ef0Argyrios Kyrtzidis  S->LeadingEmptyMacro = ReadSourceLocation(Record, Idx);
1134c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
1144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
11560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCompoundStmt(CompoundStmt *S) {
1164c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
1175f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<Stmt *, 16> Stmts;
1184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned NumStmts = Record[Idx++];
119919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  while (NumStmts--)
120d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    Stmts.push_back(Reader.ReadSubStmt());
121919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  S->setStmts(*Reader.getContext(), Stmts.data(), Stmts.size());
122c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setLBracLoc(ReadSourceLocation(Record, Idx));
123c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setRBracLoc(ReadSourceLocation(Record, Idx));
1244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
1254c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
12660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitSwitchCase(SwitchCase *S) {
1274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
1284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  Reader.RecordSwitchCaseID(S, Record[Idx++]);
1294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
1304c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
13160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCaseStmt(CaseStmt *S) {
1324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitSwitchCase(S);
133d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setLHS(Reader.ReadSubExpr());
134d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setRHS(Reader.ReadSubExpr());
135d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setSubStmt(Reader.ReadSubStmt());
136c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setCaseLoc(ReadSourceLocation(Record, Idx));
137c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setEllipsisLoc(ReadSourceLocation(Record, Idx));
138c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setColonLoc(ReadSourceLocation(Record, Idx));
1394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
1404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitDefaultStmt(DefaultStmt *S) {
1424c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitSwitchCase(S);
143d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setSubStmt(Reader.ReadSubStmt());
144c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setDefaultLoc(ReadSourceLocation(Record, Idx));
145c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setColonLoc(ReadSourceLocation(Record, Idx));
1464c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
1474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitLabelStmt(LabelStmt *S) {
1494c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
150409448c832d27703146b70a1137d86b020f29863Douglas Gregor  LabelDecl *LD = ReadDeclAs<LabelDecl>(Record, Idx);
151ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner  LD->setStmt(S);
152ad8dcf4a9df0e24051dc31bf9e6f3cd138a34298Chris Lattner  S->setDecl(LD);
153d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setSubStmt(Reader.ReadSubStmt());
154c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setIdentLoc(ReadSourceLocation(Record, Idx));
1554c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
1564c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitIfStmt(IfStmt *S) {
1584c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
159409448c832d27703146b70a1137d86b020f29863Douglas Gregor  S->setConditionVariable(*Reader.getContext(),
160409448c832d27703146b70a1137d86b020f29863Douglas Gregor                          ReadDeclAs<VarDecl>(Record, Idx));
161d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCond(Reader.ReadSubExpr());
162d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setThen(Reader.ReadSubStmt());
163d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setElse(Reader.ReadSubStmt());
164c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setIfLoc(ReadSourceLocation(Record, Idx));
165c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setElseLoc(ReadSourceLocation(Record, Idx));
1664c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
1674c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
16860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitSwitchStmt(SwitchStmt *S) {
1694c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
17043dec6bbde2d0a16c35978983761c8b7030c8e18Douglas Gregor  S->setConditionVariable(*Reader.getContext(),
171409448c832d27703146b70a1137d86b020f29863Douglas Gregor                          ReadDeclAs<VarDecl>(Record, Idx));
172d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCond(Reader.ReadSubExpr());
173d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setBody(Reader.ReadSubStmt());
174c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setSwitchLoc(ReadSourceLocation(Record, Idx));
175559fb554602bedb57dbbf3cc14ac8a38264b4547Ted Kremenek  if (Record[Idx++])
176559fb554602bedb57dbbf3cc14ac8a38264b4547Ted Kremenek    S->setAllEnumCasesCovered();
177559fb554602bedb57dbbf3cc14ac8a38264b4547Ted Kremenek
1784c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  SwitchCase *PrevSC = 0;
1794c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned N = Record.size(); Idx != N; ++Idx) {
1804c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    SwitchCase *SC = Reader.getSwitchCaseWithID(Record[Idx]);
1814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    if (PrevSC)
1824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      PrevSC->setNextSwitchCase(SC);
1834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    else
1844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S->setSwitchCaseList(SC);
1851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    PrevSC = SC;
1874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
1884c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
1894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
19060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitWhileStmt(WhileStmt *S) {
1914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
19243dec6bbde2d0a16c35978983761c8b7030c8e18Douglas Gregor  S->setConditionVariable(*Reader.getContext(),
193409448c832d27703146b70a1137d86b020f29863Douglas Gregor                          ReadDeclAs<VarDecl>(Record, Idx));
194409448c832d27703146b70a1137d86b020f29863Douglas Gregor
195d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCond(Reader.ReadSubExpr());
196d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setBody(Reader.ReadSubStmt());
197c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setWhileLoc(ReadSourceLocation(Record, Idx));
1984c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
1994c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
20060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitDoStmt(DoStmt *S) {
2014c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
202d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCond(Reader.ReadSubExpr());
203d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setBody(Reader.ReadSubStmt());
204c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setDoLoc(ReadSourceLocation(Record, Idx));
205c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setWhileLoc(ReadSourceLocation(Record, Idx));
206c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setRParenLoc(ReadSourceLocation(Record, Idx));
2074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2084c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
20960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitForStmt(ForStmt *S) {
2104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
211d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setInit(Reader.ReadSubStmt());
212d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCond(Reader.ReadSubExpr());
21343dec6bbde2d0a16c35978983761c8b7030c8e18Douglas Gregor  S->setConditionVariable(*Reader.getContext(),
214409448c832d27703146b70a1137d86b020f29863Douglas Gregor                          ReadDeclAs<VarDecl>(Record, Idx));
215d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setInc(Reader.ReadSubExpr());
216d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setBody(Reader.ReadSubStmt());
217c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setForLoc(ReadSourceLocation(Record, Idx));
218c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setLParenLoc(ReadSourceLocation(Record, Idx));
219c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setRParenLoc(ReadSourceLocation(Record, Idx));
2204c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
22260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitGotoStmt(GotoStmt *S) {
2234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
224409448c832d27703146b70a1137d86b020f29863Douglas Gregor  S->setLabel(ReadDeclAs<LabelDecl>(Record, Idx));
225c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setGotoLoc(ReadSourceLocation(Record, Idx));
226c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setLabelLoc(ReadSourceLocation(Record, Idx));
2274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
22960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitIndirectGotoStmt(IndirectGotoStmt *S) {
2304c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
231c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setGotoLoc(ReadSourceLocation(Record, Idx));
232c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setStarLoc(ReadSourceLocation(Record, Idx));
233d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setTarget(Reader.ReadSubExpr());
2344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
23660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitContinueStmt(ContinueStmt *S) {
2374c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
238c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setContinueLoc(ReadSourceLocation(Record, Idx));
2394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
24160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitBreakStmt(BreakStmt *S) {
2424c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
243c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setBreakLoc(ReadSourceLocation(Record, Idx));
2444c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2454c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
24660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitReturnStmt(ReturnStmt *S) {
2474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
248d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setRetValue(Reader.ReadSubExpr());
249c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setReturnLoc(ReadSourceLocation(Record, Idx));
250409448c832d27703146b70a1137d86b020f29863Douglas Gregor  S->setNRVOCandidate(ReadDeclAs<VarDecl>(Record, Idx));
2514c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2524c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
25360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitDeclStmt(DeclStmt *S) {
2544c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
255c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setStartLoc(ReadSourceLocation(Record, Idx));
256c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setEndLoc(ReadSourceLocation(Record, Idx));
2574c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
2584c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  if (Idx + 1 == Record.size()) {
2594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    // Single declaration
260409448c832d27703146b70a1137d86b020f29863Douglas Gregor    S->setDeclGroup(DeclGroupRef(ReadDecl(Record, Idx)));
2614c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  } else {
2625f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    SmallVector<Decl *, 16> Decls;
263409448c832d27703146b70a1137d86b020f29863Douglas Gregor    Decls.reserve(Record.size() - Idx);
264409448c832d27703146b70a1137d86b020f29863Douglas Gregor    for (unsigned N = Record.size(); Idx != N; )
265409448c832d27703146b70a1137d86b020f29863Douglas Gregor      Decls.push_back(ReadDecl(Record, Idx));
266d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner    S->setDeclGroup(DeclGroupRef(DeclGroup::Create(*Reader.getContext(),
26775fdb2377604e53678102076991bea345ace4692Douglas Gregor                                                   Decls.data(),
26875fdb2377604e53678102076991bea345ace4692Douglas Gregor                                                   Decls.size())));
2694c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
2704c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2714c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
27260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitAsmStmt(AsmStmt *S) {
2734c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
2744c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned NumOutputs = Record[Idx++];
2754c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned NumInputs = Record[Idx++];
2764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned NumClobbers = Record[Idx++];
277c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setAsmLoc(ReadSourceLocation(Record, Idx));
278c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setRParenLoc(ReadSourceLocation(Record, Idx));
2794c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setVolatile(Record[Idx++]);
2804c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  S->setSimple(Record[Idx++]);
2813b11fd3b52e7b88233c602407c151d07cb093e75Mike Stump  S->setMSAsm(Record[Idx++]);
2821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
283d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setAsmString(cast_or_null<StringLiteral>(Reader.ReadSubStmt()));
2844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
2854c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  // Outputs and inputs
2865f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<IdentifierInfo *, 16> Names;
2875f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<StringLiteral*, 16> Constraints;
2885f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<Stmt*, 16> Exprs;
2894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0, N = NumOutputs + NumInputs; I != N; ++I) {
290ff93dbd887e40588ed55d135037bb9287488b285Anders Carlsson    Names.push_back(Reader.GetIdentifierInfo(Record, Idx));
291d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    Constraints.push_back(cast_or_null<StringLiteral>(Reader.ReadSubStmt()));
292d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    Exprs.push_back(Reader.ReadSubStmt());
2934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
2944c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
2954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  // Constraints
2965f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<StringLiteral*, 16> Clobbers;
2974c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0; I != NumClobbers; ++I)
298d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    Clobbers.push_back(cast_or_null<StringLiteral>(Reader.ReadSubStmt()));
299fdba9c069023f686e2608affde02c82131ee1cf8Anders Carlsson
300acb6bcb442936f3c14126fdd473307c17647cb84Anders Carlsson  S->setOutputsAndInputsAndClobbers(*Reader.getContext(),
301acb6bcb442936f3c14126fdd473307c17647cb84Anders Carlsson                                    Names.data(), Constraints.data(),
302fdba9c069023f686e2608affde02c82131ee1cf8Anders Carlsson                                    Exprs.data(), NumOutputs, NumInputs,
303fdba9c069023f686e2608affde02c82131ee1cf8Anders Carlsson                                    Clobbers.data(), NumClobbers);
3044c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3054c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
30660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitExpr(Expr *E) {
3074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(E);
308393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor  E->setType(Reader.readType(F, Record, Idx));
3094c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setTypeDependent(Record[Idx++]);
3104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setValueDependent(Record[Idx++]);
311561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  E->setInstantiationDependent(Record[Idx++]);
312d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  E->ExprBits.ContainsUnexpandedParameterPack = Record[Idx++];
313f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  E->setValueKind(static_cast<ExprValueKind>(Record[Idx++]));
314f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall  E->setObjectKind(static_cast<ExprObjectKind>(Record[Idx++]));
3154c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  assert(Idx == NumExprFields && "Incorrect expression field count");
3164c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3174c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
31860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitPredefinedExpr(PredefinedExpr *E) {
3194c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
320c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLocation(ReadSourceLocation(Record, Idx));
3214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setIdentType((PredefinedExpr::IdentType)Record[Idx++]);
3224c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
32460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitDeclRefExpr(DeclRefExpr *E) {
3254c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
326663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
327cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth  E->DeclRefExprBits.HasQualifier = Record[Idx++];
3283aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth  E->DeclRefExprBits.HasFoundDecl = Record[Idx++];
329cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth  E->DeclRefExprBits.HasExplicitTemplateArgs = Record[Idx++];
330b0ca137bf399d956a3424816c238bc2532250d17Anders Carlsson  unsigned NumTemplateArgs = 0;
331cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth  if (E->hasExplicitTemplateArgs())
332b0ca137bf399d956a3424816c238bc2532250d17Anders Carlsson    NumTemplateArgs = Record[Idx++];
333b0ca137bf399d956a3424816c238bc2532250d17Anders Carlsson
334cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth  if (E->hasQualifier())
3356857c3e12c86fd0271eb46baab5b18756a94f4cbChandler Carruth    E->getInternalQualifierLoc()
33640d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor      = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
337663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
3383aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth  if (E->hasFoundDecl())
339409448c832d27703146b70a1137d86b020f29863Douglas Gregor    E->getInternalFoundDecl() = ReadDeclAs<NamedDecl>(Record, Idx);
3403aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth
341cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth  if (E->hasExplicitTemplateArgs())
342096832c5ed5b9106fa177ebc148489760c3bc496John McCall    ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),
343663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis                                     NumTemplateArgs);
344663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
345409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->setDecl(ReadDeclAs<ValueDecl>(Record, Idx));
346c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLocation(ReadSourceLocation(Record, Idx));
3474045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  ReadDeclarationNameLoc(E->DNLoc, E->getDecl()->getDeclName(), Record, Idx);
3484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3494c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
35060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitIntegerLiteral(IntegerLiteral *E) {
3514c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
352c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLocation(ReadSourceLocation(Record, Idx));
3539996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  E->setValue(*Reader.getContext(), Reader.ReadAPInt(Record, Idx));
3544c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3554c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
35660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitFloatingLiteral(FloatingLiteral *E) {
3574c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
3589996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis  E->setValue(*Reader.getContext(), Reader.ReadAPFloat(Record, Idx));
3594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setExact(Record[Idx++]);
360c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLocation(ReadSourceLocation(Record, Idx));
3614c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3624c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
36360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitImaginaryLiteral(ImaginaryLiteral *E) {
3644c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
365d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
3664c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3674c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
36860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitStringLiteral(StringLiteral *E) {
3694c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
3704c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned Len = Record[Idx++];
3711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  assert(Record[Idx] == E->getNumConcatenated() &&
3724c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner         "Wrong number of concatenated tokens!");
3734c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  ++Idx;
3745cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor  E->Kind = static_cast<StringLiteral::StringKind>(Record[Idx++]);
3753e2193ce5feb2feb092e5ae615e85148e06e9fd2Anders Carlsson  E->IsPascal = Record[Idx++];
3764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
3771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Read string data
378b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar  llvm::SmallString<16> Str(&Record[Idx], &Record[Idx] + Len);
379b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar  E->setString(*Reader.getContext(), Str.str());
3804c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  Idx += Len;
3814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
3824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  // Read source locations
3834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0, N = E->getNumConcatenated(); I != N; ++I)
384c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    E->setStrTokenLoc(I, ReadSourceLocation(Record, Idx));
3854c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
38760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCharacterLiteral(CharacterLiteral *E) {
3884c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
3894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setValue(Record[Idx++]);
390c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLocation(ReadSourceLocation(Record, Idx));
3915cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor  E->setKind(static_cast<CharacterLiteral::CharacterKind>(Record[Idx++]));
3924c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
39460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitParenExpr(ParenExpr *E) {
3954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
396c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLParen(ReadSourceLocation(Record, Idx));
397c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRParen(ReadSourceLocation(Record, Idx));
398d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
3994c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4004c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
40160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitParenListExpr(ParenListExpr *E) {
40237bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  VisitExpr(E);
40337bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  unsigned NumExprs = Record[Idx++];
40437bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  E->Exprs = new (*Reader.getContext()) Stmt*[NumExprs];
40537bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  for (unsigned i = 0; i != NumExprs; ++i)
40637bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis    E->Exprs[i] = Reader.ReadSubStmt();
40737bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  E->NumExprs = NumExprs;
408c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->LParenLoc = ReadSourceLocation(Record, Idx);
409c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->RParenLoc = ReadSourceLocation(Record, Idx);
41037bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis}
41137bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis
41260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitUnaryOperator(UnaryOperator *E) {
4134c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
414d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
4154c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setOpcode((UnaryOperator::Opcode)Record[Idx++]);
416c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setOperatorLoc(ReadSourceLocation(Record, Idx));
4174c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
41960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitOffsetOfExpr(OffsetOfExpr *E) {
4208ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  typedef OffsetOfExpr::OffsetOfNode Node;
4218ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  VisitExpr(E);
4228ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  assert(E->getNumComponents() == Record[Idx]);
4238ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  ++Idx;
4248ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  assert(E->getNumExpressions() == Record[Idx]);
4258ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  ++Idx;
426c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setOperatorLoc(ReadSourceLocation(Record, Idx));
427c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRParenLoc(ReadSourceLocation(Record, Idx));
428c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setTypeSourceInfo(GetTypeSourceInfo(Record, Idx));
4298ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
4308ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Node::Kind Kind = static_cast<Node::Kind>(Record[Idx++]);
431c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SourceLocation Start = ReadSourceLocation(Record, Idx);
432c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SourceLocation End = ReadSourceLocation(Record, Idx);
4338ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    switch (Kind) {
4348ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Array:
4358ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      E->setComponent(I, Node(Start, Record[Idx++], End));
4368ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
4378ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
4388ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Field:
439409448c832d27703146b70a1137d86b020f29863Douglas Gregor      E->setComponent(I, Node(Start, ReadDeclAs<FieldDecl>(Record, Idx), End));
4408ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
4418ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
4428ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Identifier:
4438ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      E->setComponent(I, Node(Start, Reader.GetIdentifier(Record[Idx++]), End));
4448ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
445cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor
446afbf3127cbdebc7d3d8711c51b1d013afa57e849Argyrios Kyrtzidis    case Node::Base: {
447afbf3127cbdebc7d3d8711c51b1d013afa57e849Argyrios Kyrtzidis      CXXBaseSpecifier *Base = new (*Reader.getContext()) CXXBaseSpecifier();
448c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      *Base = Reader.ReadCXXBaseSpecifier(F, Record, Idx);
449afbf3127cbdebc7d3d8711c51b1d013afa57e849Argyrios Kyrtzidis      E->setComponent(I, Node(Base));
450cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      break;
4518ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
452afbf3127cbdebc7d3d8711c51b1d013afa57e849Argyrios Kyrtzidis    }
4538ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
4548ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
4558ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I)
456d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setIndexExpr(I, Reader.ReadSubExpr());
4578ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
4588ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
459f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbournevoid ASTStmtReader::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) {
4604c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
461f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  E->setKind(static_cast<UnaryExprOrTypeTrait>(Record[Idx++]));
4624c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  if (Record[Idx] == 0) {
463d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setArgument(Reader.ReadSubExpr());
4644c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    ++Idx;
4654c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  } else {
466c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    E->setArgument(GetTypeSourceInfo(Record, Idx));
4674c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
468c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setOperatorLoc(ReadSourceLocation(Record, Idx));
469c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRParenLoc(ReadSourceLocation(Record, Idx));
4704c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4714c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
47260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
4734c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
474d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setLHS(Reader.ReadSubExpr());
475d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setRHS(Reader.ReadSubExpr());
476c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRBracketLoc(ReadSourceLocation(Record, Idx));
4774c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4784c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
47960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCallExpr(CallExpr *E) {
4804c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
481d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner  E->setNumArgs(*Reader.getContext(), Record[Idx++]);
482c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRParenLoc(ReadSourceLocation(Record, Idx));
483d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setCallee(Reader.ReadSubExpr());
4844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
485d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setArg(I, Reader.ReadSubExpr());
4864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
4887110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCallvoid ASTStmtReader::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
4897110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  VisitCallExpr(E);
4907110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall}
4917110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall
49260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitMemberExpr(MemberExpr *E) {
493663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  // Don't call VisitExpr, this is fully initialized at creation.
494663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  assert(E->getStmtClass() == Stmt::MemberExprClass &&
495663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis         "It's a subclass, we must advance Idx!");
4964c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4974c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
49860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCIsaExpr(ObjCIsaExpr *E) {
499f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff  VisitExpr(E);
500d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
501c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setIsaMemberLoc(ReadSourceLocation(Record, Idx));
502f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff  E->setArrow(Record[Idx++]);
503f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff}
504f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff
505f85e193739c953358c865005855253af4f68a497John McCallvoid ASTStmtReader::
506f85e193739c953358c865005855253af4f68a497John McCallVisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
507f85e193739c953358c865005855253af4f68a497John McCall  VisitExpr(E);
508f85e193739c953358c865005855253af4f68a497John McCall  E->Operand = Reader.ReadSubExpr();
509f85e193739c953358c865005855253af4f68a497John McCall  E->setShouldCopy(Record[Idx++]);
510f85e193739c953358c865005855253af4f68a497John McCall}
511f85e193739c953358c865005855253af4f68a497John McCall
512f85e193739c953358c865005855253af4f68a497John McCallvoid ASTStmtReader::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
513f85e193739c953358c865005855253af4f68a497John McCall  VisitExplicitCastExpr(E);
514f85e193739c953358c865005855253af4f68a497John McCall  E->LParenLoc = ReadSourceLocation(Record, Idx);
515f85e193739c953358c865005855253af4f68a497John McCall  E->BridgeKeywordLoc = ReadSourceLocation(Record, Idx);
516f85e193739c953358c865005855253af4f68a497John McCall  E->Kind = Record[Idx++];
517f85e193739c953358c865005855253af4f68a497John McCall}
518f85e193739c953358c865005855253af4f68a497John McCall
51960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCastExpr(CastExpr *E) {
5204c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
521f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  unsigned NumBaseSpecs = Record[Idx++];
522f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  assert(NumBaseSpecs == E->path_size());
523d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
524cdef2b75aa60cde1ca00e0aa3f89139ac89c6ae4Anders Carlsson  E->setCastKind((CastExpr::CastKind)Record[Idx++]);
525f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  CastExpr::path_iterator BaseI = E->path_begin();
5260745d0a648b75bd304045309276c70a755adaafbArgyrios Kyrtzidis  while (NumBaseSpecs--) {
5270745d0a648b75bd304045309276c70a755adaafbArgyrios Kyrtzidis    CXXBaseSpecifier *BaseSpec = new (*Reader.getContext()) CXXBaseSpecifier;
528c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    *BaseSpec = Reader.ReadCXXBaseSpecifier(F, Record, Idx);
529f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    *BaseI++ = BaseSpec;
5300745d0a648b75bd304045309276c70a755adaafbArgyrios Kyrtzidis  }
5314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
53360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitBinaryOperator(BinaryOperator *E) {
5344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
535d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setLHS(Reader.ReadSubExpr());
536d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setRHS(Reader.ReadSubExpr());
5374c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setOpcode((BinaryOperator::Opcode)Record[Idx++]);
538c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setOperatorLoc(ReadSourceLocation(Record, Idx));
5394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
54160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
5424c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitBinaryOperator(E);
543393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor  E->setComputationLHSType(Reader.readType(F, Record, Idx));
544393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor  E->setComputationResultType(Reader.readType(F, Record, Idx));
5454c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5464c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
54760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitConditionalOperator(ConditionalOperator *E) {
5484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
54956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  E->SubExprs[ConditionalOperator::COND] = Reader.ReadSubExpr();
55056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  E->SubExprs[ConditionalOperator::LHS] = Reader.ReadSubExpr();
55156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  E->SubExprs[ConditionalOperator::RHS] = Reader.ReadSubExpr();
55256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  E->QuestionLoc = ReadSourceLocation(Record, Idx);
55356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  E->ColonLoc = ReadSourceLocation(Record, Idx);
55456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall}
55556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
55656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallvoid
55756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallASTStmtReader::VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {
55856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  VisitExpr(E);
55956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  E->OpaqueValue = cast<OpaqueValueExpr>(Reader.ReadSubExpr());
56056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  E->SubExprs[BinaryConditionalOperator::COMMON] = Reader.ReadSubExpr();
56156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  E->SubExprs[BinaryConditionalOperator::COND] = Reader.ReadSubExpr();
56256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  E->SubExprs[BinaryConditionalOperator::LHS] = Reader.ReadSubExpr();
56356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  E->SubExprs[BinaryConditionalOperator::RHS] = Reader.ReadSubExpr();
56456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  E->QuestionLoc = ReadSourceLocation(Record, Idx);
56556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  E->ColonLoc = ReadSourceLocation(Record, Idx);
56656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
56756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  E->getOpaqueValue()->setSourceExpr(E->getCommon());
5684c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5694c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
57060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitImplicitCastExpr(ImplicitCastExpr *E) {
5714c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitCastExpr(E);
5724c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5734c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
57460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitExplicitCastExpr(ExplicitCastExpr *E) {
5754c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitCastExpr(E);
576c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setTypeInfoAsWritten(GetTypeSourceInfo(Record, Idx));
5774c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5784c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
57960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCStyleCastExpr(CStyleCastExpr *E) {
5804c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExplicitCastExpr(E);
581c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLParenLoc(ReadSourceLocation(Record, Idx));
582c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRParenLoc(ReadSourceLocation(Record, Idx));
5834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
58560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
5864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
587c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLParenLoc(ReadSourceLocation(Record, Idx));
588c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setTypeSourceInfo(GetTypeSourceInfo(Record, Idx));
589d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setInitializer(Reader.ReadSubExpr());
5904c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setFileScope(Record[Idx++]);
5914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5924c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
59360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
5944c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
595d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
5964c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setAccessor(Reader.GetIdentifierInfo(Record, Idx));
597c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setAccessorLoc(ReadSourceLocation(Record, Idx));
5984c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5994c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
60060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitInitListExpr(InitListExpr *E) {
6014c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
602d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSyntacticForm(cast_or_null<InitListExpr>(Reader.ReadSubStmt()));
603c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLBraceLoc(ReadSourceLocation(Record, Idx));
604c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRBraceLoc(ReadSourceLocation(Record, Idx));
6052ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis  bool isArrayFiller = Record[Idx++];
6062ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis  Expr *filler = 0;
6072ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis  if (isArrayFiller) {
6082ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis    filler = Reader.ReadSubExpr();
6092ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis    E->ArrayFillerOrUnionFieldInit = filler;
6102ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis  } else
611409448c832d27703146b70a1137d86b020f29863Douglas Gregor    E->ArrayFillerOrUnionFieldInit = ReadDeclAs<FieldDecl>(Record, Idx);
6124c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->sawArrayRangeDesignator(Record[Idx++]);
6132ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis  unsigned NumInits = Record[Idx++];
6142ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis  E->reserveInits(*Reader.getContext(), NumInits);
6152ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis  if (isArrayFiller) {
6162ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis    for (unsigned I = 0; I != NumInits; ++I) {
6172ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis      Expr *init = Reader.ReadSubExpr();
6182ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis      E->updateInit(*Reader.getContext(), I, init ? init : filler);
6192ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis    }
6202ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis  } else {
6212ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis    for (unsigned I = 0; I != NumInits; ++I)
6222ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis      E->updateInit(*Reader.getContext(), I, Reader.ReadSubExpr());
6232ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis  }
6244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
6254c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
62660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
6274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  typedef DesignatedInitExpr::Designator Designator;
6284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
6294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
6304c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned NumSubExprs = Record[Idx++];
6314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  assert(NumSubExprs == E->getNumSubExprs() && "Wrong number of subexprs");
6324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0; I != NumSubExprs; ++I)
633d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setSubExpr(I, Reader.ReadSubExpr());
634c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setEqualOrColonLoc(ReadSourceLocation(Record, Idx));
6354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setGNUSyntax(Record[Idx++]);
6364c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
6375f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<Designator, 4> Designators;
6384c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  while (Idx < Record.size()) {
6398538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    switch ((DesignatorTypes)Record[Idx++]) {
6408538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case DESIG_FIELD_DECL: {
641409448c832d27703146b70a1137d86b020f29863Douglas Gregor      FieldDecl *Field = ReadDeclAs<FieldDecl>(Record, Idx);
6421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      SourceLocation DotLoc
643c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        = ReadSourceLocation(Record, Idx);
6441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      SourceLocation FieldLoc
645c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        = ReadSourceLocation(Record, Idx);
6461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Designators.push_back(Designator(Field->getIdentifier(), DotLoc,
6474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner                                       FieldLoc));
6484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      Designators.back().setField(Field);
6494c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
6504c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
6514c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
6528538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case DESIG_FIELD_NAME: {
6534c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      const IdentifierInfo *Name = Reader.GetIdentifierInfo(Record, Idx);
6541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      SourceLocation DotLoc
655c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        = ReadSourceLocation(Record, Idx);
6561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      SourceLocation FieldLoc
657c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        = ReadSourceLocation(Record, Idx);
6584c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      Designators.push_back(Designator(Name, DotLoc, FieldLoc));
6594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
6604c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
6611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6628538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case DESIG_ARRAY: {
6634c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      unsigned Index = Record[Idx++];
6644c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      SourceLocation LBracketLoc
665c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        = ReadSourceLocation(Record, Idx);
6664c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      SourceLocation RBracketLoc
667c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        = ReadSourceLocation(Record, Idx);
6684c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      Designators.push_back(Designator(Index, LBracketLoc, RBracketLoc));
6694c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
6704c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
6714c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
6728538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case DESIG_ARRAY_RANGE: {
6734c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      unsigned Index = Record[Idx++];
6744c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      SourceLocation LBracketLoc
675c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        = ReadSourceLocation(Record, Idx);
6764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      SourceLocation EllipsisLoc
677c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        = ReadSourceLocation(Record, Idx);
6784c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      SourceLocation RBracketLoc
679c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        = ReadSourceLocation(Record, Idx);
6804c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      Designators.push_back(Designator(Index, LBracketLoc, EllipsisLoc,
6814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner                                       RBracketLoc));
6824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
6834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
6844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
6854c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
686319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor  E->setDesignators(*Reader.getContext(),
687319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor                    Designators.data(), Designators.size());
6884c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
6894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
69060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
6914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
6924c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
6934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
69460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitVAArgExpr(VAArgExpr *E) {
6954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
696d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
697c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setWrittenTypeInfo(GetTypeSourceInfo(Record, Idx));
698c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setBuiltinLoc(ReadSourceLocation(Record, Idx));
699c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRParenLoc(ReadSourceLocation(Record, Idx));
7004c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7014c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
70260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitAddrLabelExpr(AddrLabelExpr *E) {
7034c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
704c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setAmpAmpLoc(ReadSourceLocation(Record, Idx));
705c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLabelLoc(ReadSourceLocation(Record, Idx));
706409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->setLabel(ReadDeclAs<LabelDecl>(Record, Idx));
7074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7084c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
70960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitStmtExpr(StmtExpr *E) {
7104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
711c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLParenLoc(ReadSourceLocation(Record, Idx));
712c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRParenLoc(ReadSourceLocation(Record, Idx));
713d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubStmt(cast_or_null<CompoundStmt>(Reader.ReadSubStmt()));
7144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7154c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
71660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitChooseExpr(ChooseExpr *E) {
7174c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
718d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setCond(Reader.ReadSubExpr());
719d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setLHS(Reader.ReadSubExpr());
720d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setRHS(Reader.ReadSubExpr());
721c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setBuiltinLoc(ReadSourceLocation(Record, Idx));
722c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRParenLoc(ReadSourceLocation(Record, Idx));
7234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
72560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitGNUNullExpr(GNUNullExpr *E) {
7264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
727c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setTokenLocation(ReadSourceLocation(Record, Idx));
7284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
73060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
7314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
7325f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<Expr *, 16> Exprs;
7334c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned NumExprs = Record[Idx++];
734919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  while (NumExprs--)
735d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    Exprs.push_back(Reader.ReadSubExpr());
736919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  E->setExprs(*Reader.getContext(), Exprs.data(), Exprs.size());
737c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setBuiltinLoc(ReadSourceLocation(Record, Idx));
738c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRParenLoc(ReadSourceLocation(Record, Idx));
7394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
74160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitBlockExpr(BlockExpr *E) {
7424c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
743409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->setBlockDecl(ReadDeclAs<BlockDecl>(Record, Idx));
7444c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7454c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
74660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitBlockDeclRefExpr(BlockDeclRefExpr *E) {
7474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
748409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->setDecl(ReadDeclAs<VarDecl>(Record, Idx));
749c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLocation(ReadSourceLocation(Record, Idx));
7504c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setByRef(Record[Idx++]);
7519b0b57c6f9996bfdb67248f6942dd23acfa36167Fariborz Jahanian  E->setConstQualAdded(Record[Idx++]);
7524c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7534c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
754f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbournevoid ASTStmtReader::VisitGenericSelectionExpr(GenericSelectionExpr *E) {
755f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  VisitExpr(E);
756f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  E->NumAssocs = Record[Idx++];
757f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  E->AssocTypes = new (*Reader.getContext()) TypeSourceInfo*[E->NumAssocs];
758f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  E->SubExprs =
759f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne   new(*Reader.getContext()) Stmt*[GenericSelectionExpr::END_EXPR+E->NumAssocs];
760f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
761f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  E->SubExprs[GenericSelectionExpr::CONTROLLING] = Reader.ReadSubExpr();
762f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  for (unsigned I = 0, N = E->getNumAssocs(); I != N; ++I) {
763f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    E->AssocTypes[I] = GetTypeSourceInfo(Record, Idx);
764f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    E->SubExprs[GenericSelectionExpr::END_EXPR+I] = Reader.ReadSubExpr();
765f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  }
766f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  E->ResultIndex = Record[Idx++];
767f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
768f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  E->GenericLoc = ReadSourceLocation(Record, Idx);
769f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  E->DefaultLoc = ReadSourceLocation(Record, Idx);
770f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  E->RParenLoc = ReadSourceLocation(Record, Idx);
771f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne}
772f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
7734c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner//===----------------------------------------------------------------------===//
7744c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner// Objective-C Expressions and Statements
7754c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
77660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCStringLiteral(ObjCStringLiteral *E) {
7774c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
778d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setString(cast<StringLiteral>(Reader.ReadSubStmt()));
779c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setAtLoc(ReadSourceLocation(Record, Idx));
7804c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
78260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
7834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
784c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setEncodedTypeSourceInfo(GetTypeSourceInfo(Record, Idx));
785c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setAtLoc(ReadSourceLocation(Record, Idx));
786c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRParenLoc(ReadSourceLocation(Record, Idx));
7874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7884c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
78960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
7904c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
7914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setSelector(Reader.GetSelector(Record, Idx));
792c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setAtLoc(ReadSourceLocation(Record, Idx));
793c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRParenLoc(ReadSourceLocation(Record, Idx));
7944c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
79660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
7974c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
798409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->setProtocol(ReadDeclAs<ObjCProtocolDecl>(Record, Idx));
799c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setAtLoc(ReadSourceLocation(Record, Idx));
800c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRParenLoc(ReadSourceLocation(Record, Idx));
8014c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8024c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
80360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
8044c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
805409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->setDecl(ReadDeclAs<ObjCIvarDecl>(Record, Idx));
806c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLocation(ReadSourceLocation(Record, Idx));
807d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
8084c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setIsArrow(Record[Idx++]);
8094c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setIsFreeIvar(Record[Idx++]);
8104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8114c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
81260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
8134c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
81412f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  bool Implicit = Record[Idx++] != 0;
81512f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  if (Implicit) {
816409448c832d27703146b70a1137d86b020f29863Douglas Gregor    ObjCMethodDecl *Getter = ReadDeclAs<ObjCMethodDecl>(Record, Idx);
817409448c832d27703146b70a1137d86b020f29863Douglas Gregor    ObjCMethodDecl *Setter = ReadDeclAs<ObjCMethodDecl>(Record, Idx);
81812f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    E->setImplicitProperty(Getter, Setter);
81912f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  } else {
820409448c832d27703146b70a1137d86b020f29863Douglas Gregor    E->setExplicitProperty(ReadDeclAs<ObjCPropertyDecl>(Record, Idx));
8218ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian  }
822c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLocation(ReadSourceLocation(Record, Idx));
82312f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  E->setReceiverLocation(ReadSourceLocation(Record, Idx));
82412f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  switch (Record[Idx++]) {
82512f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  case 0:
82612f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    E->setBase(Reader.ReadSubExpr());
82712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    break;
82812f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  case 1:
829393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    E->setSuperReceiver(Reader.readType(F, Record, Idx));
83012f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    break;
83112f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  case 2:
832409448c832d27703146b70a1137d86b020f29863Douglas Gregor    E->setClassReceiver(ReadDeclAs<ObjCInterfaceDecl>(Record, Idx));
83312f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    break;
83412f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  }
8354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8364c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
83760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCMessageExpr(ObjCMessageExpr *E) {
8384c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
83904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  assert(Record[Idx] == E->getNumArgs());
84004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  ++Idx;
841f85e193739c953358c865005855253af4f68a497John McCall  E->setDelegateInitCall(Record[Idx++]);
84204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  ObjCMessageExpr::ReceiverKind Kind
84304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    = static_cast<ObjCMessageExpr::ReceiverKind>(Record[Idx++]);
84404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  switch (Kind) {
84504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::Instance:
846d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setInstanceReceiver(Reader.ReadSubExpr());
84704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
84804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
84904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::Class:
850c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    E->setClassReceiver(GetTypeSourceInfo(Record, Idx));
85104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
85204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
85304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::SuperClass:
85404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::SuperInstance: {
855393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType T = Reader.readType(F, Record, Idx);
856c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SourceLocation SuperLoc = ReadSourceLocation(Record, Idx);
85704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    E->setSuper(SuperLoc, T, Kind == ObjCMessageExpr::SuperInstance);
85804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
85904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  }
8604c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
8614c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
86204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  assert(Kind == E->getReceiverKind());
86304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
86404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  if (Record[Idx++])
865409448c832d27703146b70a1137d86b020f29863Douglas Gregor    E->setMethodDecl(ReadDeclAs<ObjCMethodDecl>(Record, Idx));
86604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  else
86704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    E->setSelector(Reader.GetSelector(Record, Idx));
86804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
869f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis  E->LBracLoc = ReadSourceLocation(Record, Idx);
870f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis  E->RBracLoc = ReadSourceLocation(Record, Idx);
871f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis  E->SelectorLoc = ReadSourceLocation(Record, Idx);
87204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
8734c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
874d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setArg(I, Reader.ReadSubExpr());
8754c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
87760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
8784c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
879d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setElement(Reader.ReadSubStmt());
880d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCollection(Reader.ReadSubExpr());
881d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setBody(Reader.ReadSubStmt());
882c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setForLoc(ReadSourceLocation(Record, Idx));
883c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setRParenLoc(ReadSourceLocation(Record, Idx));
8844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8854c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
88660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
8874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
888d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCatchBody(Reader.ReadSubStmt());
889409448c832d27703146b70a1137d86b020f29863Douglas Gregor  S->setCatchParamDecl(ReadDeclAs<VarDecl>(Record, Idx));
890c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setAtCatchLoc(ReadSourceLocation(Record, Idx));
891c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setRParenLoc(ReadSourceLocation(Record, Idx));
8924c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
89460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
8954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
896d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setFinallyBody(Reader.ReadSubStmt());
897c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setAtFinallyLoc(ReadSourceLocation(Record, Idx));
8984c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8994c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
900f85e193739c953358c865005855253af4f68a497John McCallvoid ASTStmtReader::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S) {
901f85e193739c953358c865005855253af4f68a497John McCall  VisitStmt(S);
902f85e193739c953358c865005855253af4f68a497John McCall  S->setSubStmt(Reader.ReadSubStmt());
903f85e193739c953358c865005855253af4f68a497John McCall  S->setAtLoc(ReadSourceLocation(Record, Idx));
904f85e193739c953358c865005855253af4f68a497John McCall}
905f85e193739c953358c865005855253af4f68a497John McCall
90660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
9074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
9088f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  assert(Record[Idx] == S->getNumCatchStmts());
9098f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  ++Idx;
9108f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  bool HasFinally = Record[Idx++];
911d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setTryBody(Reader.ReadSubStmt());
912919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I)
913d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    S->setCatchStmt(I, cast_or_null<ObjCAtCatchStmt>(Reader.ReadSubStmt()));
9148f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor
9158f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  if (HasFinally)
916d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    S->setFinallyStmt(Reader.ReadSubStmt());
917c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setAtTryLoc(ReadSourceLocation(Record, Idx));
9184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
9194c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
92060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {
9214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
922d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setSynchExpr(Reader.ReadSubStmt());
923d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setSynchBody(Reader.ReadSubStmt());
924c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setAtSynchronizedLoc(ReadSourceLocation(Record, Idx));
9254c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
9264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
92760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
9284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
929d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setThrowExpr(Reader.ReadSubStmt());
930c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setThrowLoc(ReadSourceLocation(Record, Idx));
9314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
9324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
933ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
934ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis// C++ Expressions and Statements
9357cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
9367cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis
93760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXCatchStmt(CXXCatchStmt *S) {
9387cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  VisitStmt(S);
939c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->CatchLoc = ReadSourceLocation(Record, Idx);
940409448c832d27703146b70a1137d86b020f29863Douglas Gregor  S->ExceptionDecl = ReadDeclAs<VarDecl>(Record, Idx);
9417cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  S->HandlerBlock = Reader.ReadSubStmt();
9427cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis}
9437cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis
94460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXTryStmt(CXXTryStmt *S) {
9457cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  VisitStmt(S);
9467cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  assert(Record[Idx] == S->getNumHandlers() && "NumStmtFields is wrong ?");
9477cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  ++Idx;
948c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->TryLoc = ReadSourceLocation(Record, Idx);
9497cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  S->getStmts()[0] = Reader.ReadSubStmt();
9507cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  for (unsigned i = 0, e = S->getNumHandlers(); i != e; ++i)
9517cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis    S->getStmts()[i + 1] = Reader.ReadSubStmt();
9527cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis}
953ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis
954ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smithvoid ASTStmtReader::VisitCXXForRangeStmt(CXXForRangeStmt *S) {
955ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  VisitStmt(S);
956ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  S->setForLoc(ReadSourceLocation(Record, Idx));
957ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  S->setColonLoc(ReadSourceLocation(Record, Idx));
958ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  S->setRParenLoc(ReadSourceLocation(Record, Idx));
959ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  S->setRangeStmt(Reader.ReadSubStmt());
960ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  S->setBeginEndStmt(Reader.ReadSubStmt());
961ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  S->setCond(Reader.ReadSubExpr());
962ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  S->setInc(Reader.ReadSubExpr());
963ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  S->setLoopVarStmt(Reader.ReadSubStmt());
964ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  S->setBody(Reader.ReadSubStmt());
965ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith}
966ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith
96760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
968919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  VisitCallExpr(E);
969ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis  E->setOperator((OverloadedOperatorKind)Record[Idx++]);
970ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis}
971ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis
97260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXConstructExpr(CXXConstructExpr *E) {
97339da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor  VisitExpr(E);
9746d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  E->NumArgs = Record[Idx++];
9756d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  if (E->NumArgs)
9766d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis    E->Args = new (*Reader.getContext()) Stmt*[E->NumArgs];
9775e1b7c2f419544a88537f7ff4e32ed744ba7b44eArgyrios Kyrtzidis  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
978d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setArg(I, Reader.ReadSubExpr());
979409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->setConstructor(ReadDeclAs<CXXConstructorDecl>(Record, Idx));
980c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLocation(ReadSourceLocation(Record, Idx));
98139da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor  E->setElidable(Record[Idx++]);
98216006c901315fa12a108b4e571f187f4b676e426Douglas Gregor  E->setRequiresZeroInitialization(Record[Idx++]);
9833c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor  E->setConstructionKind((CXXConstructExpr::ConstructionKind)Record[Idx++]);
984428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth  E->ParenRange = ReadSourceRange(Record, Idx);
98539da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor}
9864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
98760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {
9886d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  VisitCXXConstructExpr(E);
989c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->Type = GetTypeSourceInfo(Record, Idx);
9906d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis}
9916d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis
99260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
993919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  VisitExplicitCastExpr(E);
9941d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor  SourceRange R = ReadSourceRange(Record, Idx);
9951d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor  E->Loc = R.getBegin();
9961d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor  E->RParenLoc = R.getEnd();
997ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
998ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
99960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
1000ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig  return VisitCXXNamedCastExpr(E);
1001ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
1002ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
100360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
1004ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig  return VisitCXXNamedCastExpr(E);
1005ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
1006ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
100760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) {
1008ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig  return VisitCXXNamedCastExpr(E);
1009ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
1010ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
101160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
1012ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig  return VisitCXXNamedCastExpr(E);
1013ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
1014ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
101560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {
1016919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  VisitExplicitCastExpr(E);
1017c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setTypeBeginLoc(ReadSourceLocation(Record, Idx));
1018c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRParenLoc(ReadSourceLocation(Record, Idx));
1019ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
1020ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
102160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
1022eb7f96141f754150a92433286fa385910a22f494Sam Weinig  VisitExpr(E);
1023eb7f96141f754150a92433286fa385910a22f494Sam Weinig  E->setValue(Record[Idx++]);
1024c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLocation(ReadSourceLocation(Record, Idx));
1025eb7f96141f754150a92433286fa385910a22f494Sam Weinig}
1026eb7f96141f754150a92433286fa385910a22f494Sam Weinig
102760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
1028eb7f96141f754150a92433286fa385910a22f494Sam Weinig  VisitExpr(E);
1029c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLocation(ReadSourceLocation(Record, Idx));
1030eb7f96141f754150a92433286fa385910a22f494Sam Weinig}
1031eb7f96141f754150a92433286fa385910a22f494Sam Weinig
103260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
103314ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner  VisitExpr(E);
1034c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setSourceRange(ReadSourceRange(Record, Idx));
103514ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner  if (E->isTypeOperand()) { // typeid(int)
1036577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    E->setTypeOperandSourceInfo(
1037c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        GetTypeSourceInfo(Record, Idx));
1038919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    return;
103914ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner  }
104014ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner
104114ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner  // typeid(42+2)
1042d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setExprOperand(Reader.ReadSubExpr());
104314ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner}
104414ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner
104560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXThisExpr(CXXThisExpr *E) {
10462fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner  VisitExpr(E);
1047c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLocation(ReadSourceLocation(Record, Idx));
10482fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner  E->setImplicit(Record[Idx++]);
10492fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner}
10502fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner
105160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXThrowExpr(CXXThrowExpr *E) {
10522fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner  VisitExpr(E);
1053bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor  E->ThrowLoc = ReadSourceLocation(Record, Idx);
1054bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor  E->Op = Reader.ReadSubExpr();
1055bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor  E->IsThrownVariableInScope = Record[Idx++];
10562fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner}
105714ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner
105860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
1059030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner  VisitExpr(E);
10608a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis
10618a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis  assert(Record[Idx] == E->Param.getInt() && "We messed up at creation ?");
10628a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis  ++Idx; // HasOtherExprStored and SubExpr was handled during creation.
1063409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->Param.setPointer(ReadDeclAs<ParmVarDecl>(Record, Idx));
1064c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->Loc = ReadSourceLocation(Record, Idx);
1065d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner}
1066d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner
106760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
1068d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner  VisitExpr(E);
1069409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->setTemporary(Reader.ReadCXXTemporary(F, Record, Idx));
1070d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
1071d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner}
1072d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner
107360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
10745921863d8f24084797863b5df37842113bac4352Chris Lattner  VisitExpr(E);
1075c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->TypeInfo = GetTypeSourceInfo(Record, Idx);
1076c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->RParenLoc = ReadSourceLocation(Record, Idx);
10775921863d8f24084797863b5df37842113bac4352Chris Lattner}
10785921863d8f24084797863b5df37842113bac4352Chris Lattner
107960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXNewExpr(CXXNewExpr *E) {
10805921863d8f24084797863b5df37842113bac4352Chris Lattner  VisitExpr(E);
10816ec278d1a354517e20f13a877481453ee7940c78John McCall  E->GlobalNew = Record[Idx++];
10826ec278d1a354517e20f13a877481453ee7940c78John McCall  E->Initializer = Record[Idx++];
10836ec278d1a354517e20f13a877481453ee7940c78John McCall  E->UsualArrayDeleteWantsSize = Record[Idx++];
10845921863d8f24084797863b5df37842113bac4352Chris Lattner  bool isArray = Record[Idx++];
10855921863d8f24084797863b5df37842113bac4352Chris Lattner  unsigned NumPlacementArgs = Record[Idx++];
10865921863d8f24084797863b5df37842113bac4352Chris Lattner  unsigned NumCtorArgs = Record[Idx++];
1087409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->setOperatorNew(ReadDeclAs<FunctionDecl>(Record, Idx));
1088409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->setOperatorDelete(ReadDeclAs<FunctionDecl>(Record, Idx));
1089409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->setConstructor(ReadDeclAs<CXXConstructorDecl>(Record, Idx));
1090c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->AllocatedTypeInfo = GetTypeSourceInfo(Record, Idx);
10914bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor  SourceRange TypeIdParens;
1092c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TypeIdParens.setBegin(ReadSourceLocation(Record, Idx));
1093c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TypeIdParens.setEnd(ReadSourceLocation(Record, Idx));
10944bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor  E->TypeIdParens = TypeIdParens;
1095428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth  E->StartLoc = ReadSourceLocation(Record, Idx);
1096428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth  E->EndLoc = ReadSourceLocation(Record, Idx);
1097428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth  E->ConstructorLParen = ReadSourceLocation(Record, Idx);
1098428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth  E->ConstructorRParen = ReadSourceLocation(Record, Idx);
1099428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth
11005921863d8f24084797863b5df37842113bac4352Chris Lattner  E->AllocateArgsArray(*Reader.getContext(), isArray, NumPlacementArgs,
11015921863d8f24084797863b5df37842113bac4352Chris Lattner                       NumCtorArgs);
11025921863d8f24084797863b5df37842113bac4352Chris Lattner
11035921863d8f24084797863b5df37842113bac4352Chris Lattner  // Install all the subexpressions.
11045921863d8f24084797863b5df37842113bac4352Chris Lattner  for (CXXNewExpr::raw_arg_iterator I = E->raw_arg_begin(),e = E->raw_arg_end();
11055921863d8f24084797863b5df37842113bac4352Chris Lattner       I != e; ++I)
1106d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    *I = Reader.ReadSubStmt();
11075921863d8f24084797863b5df37842113bac4352Chris Lattner}
11085921863d8f24084797863b5df37842113bac4352Chris Lattner
110960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
111095fc98ce95d4faa4f1bb2783384150530404ea6fArgyrios Kyrtzidis  VisitExpr(E);
1111f1b8911d35bb2830a13267581d3cbde4b6b85db6Argyrios Kyrtzidis  E->GlobalDelete = Record[Idx++];
1112f1b8911d35bb2830a13267581d3cbde4b6b85db6Argyrios Kyrtzidis  E->ArrayForm = Record[Idx++];
11134076dacf1497fb95cb298b9d964fbdbdaf9bde6cArgyrios Kyrtzidis  E->ArrayFormAsWritten = Record[Idx++];
11146ec278d1a354517e20f13a877481453ee7940c78John McCall  E->UsualArrayDeleteWantsSize = Record[Idx++];
1115409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->OperatorDelete = ReadDeclAs<FunctionDecl>(Record, Idx);
1116f1b8911d35bb2830a13267581d3cbde4b6b85db6Argyrios Kyrtzidis  E->Argument = Reader.ReadSubExpr();
1117c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->Loc = ReadSourceLocation(Record, Idx);
111895fc98ce95d4faa4f1bb2783384150530404ea6fArgyrios Kyrtzidis}
1119d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner
112060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
1121de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  VisitExpr(E);
1122de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis
1123f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor  E->Base = Reader.ReadSubExpr();
1124f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor  E->IsArrow = Record[Idx++];
1125f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor  E->OperatorLoc = ReadSourceLocation(Record, Idx);
1126f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor  E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
1127f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor  E->ScopeType = GetTypeSourceInfo(Record, Idx);
1128f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor  E->ColonColonLoc = ReadSourceLocation(Record, Idx);
1129f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor  E->TildeLoc = ReadSourceLocation(Record, Idx);
1130de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis
1131de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  IdentifierInfo *II = Reader.GetIdentifierInfo(Record, Idx);
1132de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  if (II)
1133c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    E->setDestroyedType(II, ReadSourceLocation(Record, Idx));
1134de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  else
1135c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    E->setDestroyedType(GetTypeSourceInfo(Record, Idx));
1136de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis}
1137de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis
11384765fa05b5652fcc4356371c2f481d0ea9a1b007John McCallvoid ASTStmtReader::VisitExprWithCleanups(ExprWithCleanups *E) {
1139d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner  VisitExpr(E);
1140d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner  unsigned NumTemps = Record[Idx++];
1141d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner  if (NumTemps) {
1142d04ed416be7c55bddddab1fa3fd38a0113a6b3daTed Kremenek    E->setNumTemporaries(*Reader.getContext(), NumTemps);
1143d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner    for (unsigned i = 0; i != NumTemps; ++i)
1144409448c832d27703146b70a1137d86b020f29863Douglas Gregor      E->setTemporary(i, Reader.ReadCXXTemporary(F, Record, Idx));
1145d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner  }
1146d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
1147030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner}
1148030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner
1149919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidisvoid
115060adf4acf40b72227740bf966fb87eebddff3f37Sebastian RedlASTStmtReader::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){
11518dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  VisitExpr(E);
11528dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
1153def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor  if (Record[Idx++])
1154096832c5ed5b9106fa177ebc148489760c3bc496John McCall    ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),
1155def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                     Record[Idx++]);
11568dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
11577c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor  E->Base = Reader.ReadSubExpr();
1158393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor  E->BaseType = Reader.readType(F, Record, Idx);
11597c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor  E->IsArrow = Record[Idx++];
11607c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor  E->OperatorLoc = ReadSourceLocation(Record, Idx);
11617c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor  E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
1162409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->FirstQualifierFoundInScope = ReadDeclAs<NamedDecl>(Record, Idx);
11634045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  ReadDeclarationNameInfo(E->MemberNameInfo, Record, Idx);
11648dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis}
11658dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
1166919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidisvoid
116760adf4acf40b72227740bf966fb87eebddff3f37Sebastian RedlASTStmtReader::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
116812dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis  VisitExpr(E);
116912dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis
1170def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor  if (Record[Idx++])
1171def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor    ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),
1172def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                     Record[Idx++]);
117300cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor
117400cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor  E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
11754045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  ReadDeclarationNameInfo(E->NameInfo, Record, Idx);
117612dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis}
117712dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis
1178919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidisvoid
117960adf4acf40b72227740bf966fb87eebddff3f37Sebastian RedlASTStmtReader::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {
11808dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  VisitExpr(E);
11818dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  assert(Record[Idx] == E->arg_size() && "Read wrong record during creation ?");
11828dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  ++Idx; // NumArgs;
11838dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  for (unsigned I = 0, N = E->arg_size(); I != N; ++I)
1184d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setArg(I, Reader.ReadSubExpr());
1185c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->Type = GetTypeSourceInfo(Record, Idx);
1186c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLParenLoc(ReadSourceLocation(Record, Idx));
1187c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRParenLoc(ReadSourceLocation(Record, Idx));
11888dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis}
11898dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
119060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitOverloadExpr(OverloadExpr *E) {
1191a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  VisitExpr(E);
1192a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
1193def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor  // Read the explicit template argument list, if available.
1194def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor  if (Record[Idx++])
1195919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),
1196def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                     Record[Idx++]);
1197a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
1198a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  unsigned NumDecls = Record[Idx++];
1199a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  UnresolvedSet<8> Decls;
1200a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  for (unsigned i = 0; i != NumDecls; ++i) {
1201409448c832d27703146b70a1137d86b020f29863Douglas Gregor    NamedDecl *D = ReadDeclAs<NamedDecl>(Record, Idx);
1202a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis    AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
1203a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis    Decls.addDecl(D, AS);
1204a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  }
1205a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  E->initializeResults(*Reader.getContext(), Decls.begin(), Decls.end());
1206a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
12074045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  ReadDeclarationNameInfo(E->NameInfo, Record, Idx);
12084c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor  E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
1209a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis}
1210a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
121160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
1212919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  VisitOverloadExpr(E);
12134c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor  E->IsArrow = Record[Idx++];
12144c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor  E->HasUnresolvedUsing = Record[Idx++];
12154c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor  E->Base = Reader.ReadSubExpr();
1216393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor  E->BaseType = Reader.readType(F, Record, Idx);
12174c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor  E->OperatorLoc = ReadSourceLocation(Record, Idx);
1218a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis}
1219a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
122060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {
1221919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  VisitOverloadExpr(E);
12224c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor  E->RequiresADL = Record[Idx++];
1223ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  if (E->RequiresADL)
1224ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith    E->StdIsAssociatedNamespace = Record[Idx++];
12254c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor  E->Overloaded = Record[Idx++];
1226409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->NamingClass = ReadDeclAs<CXXRecordDecl>(Record, Idx);
1227bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis}
1228bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis
122960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
12306d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  VisitExpr(E);
12316d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  E->UTT = (UnaryTypeTrait)Record[Idx++];
12320dfd848fa4c9664852ba8c929a8bd3fce93ddca2Sebastian Redl  E->Value = (bool)Record[Idx++];
1233c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  SourceRange Range = ReadSourceRange(Record, Idx);
12346d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  E->Loc = Range.getBegin();
12356d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  E->RParen = Range.getEnd();
1236c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->QueriedType = GetTypeSourceInfo(Record, Idx);
12376d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis}
12386d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis
12396ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichetvoid ASTStmtReader::VisitBinaryTypeTraitExpr(BinaryTypeTraitExpr *E) {
12406ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  VisitExpr(E);
12416ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  E->BTT = (BinaryTypeTrait)Record[Idx++];
12426ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  E->Value = (bool)Record[Idx++];
12436ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  SourceRange Range = ReadSourceRange(Record, Idx);
12446ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  E->Loc = Range.getBegin();
12456ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  E->RParen = Range.getEnd();
12466ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  E->LhsType = GetTypeSourceInfo(Record, Idx);
12476ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  E->RhsType = GetTypeSourceInfo(Record, Idx);
12486ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet}
12496ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet
125021ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegleyvoid ASTStmtReader::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
125121ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  VisitExpr(E);
125221ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  E->ATT = (ArrayTypeTrait)Record[Idx++];
125321ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  E->Value = (unsigned int)Record[Idx++];
125421ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  SourceRange Range = ReadSourceRange(Record, Idx);
125521ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  E->Loc = Range.getBegin();
125621ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  E->RParen = Range.getEnd();
125721ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  E->QueriedType = GetTypeSourceInfo(Record, Idx);
125821ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley}
125921ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley
1260552622067dc45013d240f73952fece703f5e63bdJohn Wiegleyvoid ASTStmtReader::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {
1261552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  VisitExpr(E);
1262552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  E->ET = (ExpressionTrait)Record[Idx++];
1263552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  E->Value = (bool)Record[Idx++];
1264552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  SourceRange Range = ReadSourceRange(Record, Idx);
1265552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  E->QueriedExpression = Reader.ReadSubExpr();
1266552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  E->Loc = Range.getBegin();
1267552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  E->RParen = Range.getEnd();
1268552622067dc45013d240f73952fece703f5e63bdJohn Wiegley}
1269552622067dc45013d240f73952fece703f5e63bdJohn Wiegley
12706b219d082434394c1ac401390ec1d1967727815aSebastian Redlvoid ASTStmtReader::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
12716b219d082434394c1ac401390ec1d1967727815aSebastian Redl  VisitExpr(E);
12725221d8f2da008689f7ff9476e6522bb2b63ec1a3Sebastian Redl  E->Value = (bool)Record[Idx++];
1273c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->Range = ReadSourceRange(Record, Idx);
12745221d8f2da008689f7ff9476e6522bb2b63ec1a3Sebastian Redl  E->Operand = Reader.ReadSubExpr();
12756b219d082434394c1ac401390ec1d1967727815aSebastian Redl}
12766b219d082434394c1ac401390ec1d1967727815aSebastian Redl
1277be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregorvoid ASTStmtReader::VisitPackExpansionExpr(PackExpansionExpr *E) {
1278be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor  VisitExpr(E);
1279be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor  E->EllipsisLoc = ReadSourceLocation(Record, Idx);
128067fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor  E->NumExpansions = Record[Idx++];
1281be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor  E->Pattern = Reader.ReadSubExpr();
1282be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor}
1283be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor
1284ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregorvoid ASTStmtReader::VisitSizeOfPackExpr(SizeOfPackExpr *E) {
1285ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  VisitExpr(E);
1286ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  E->OperatorLoc = ReadSourceLocation(Record, Idx);
1287ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  E->PackLoc = ReadSourceLocation(Record, Idx);
1288ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  E->RParenLoc = ReadSourceLocation(Record, Idx);
1289ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  E->Length = Record[Idx++];
1290409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->Pack = ReadDeclAs<NamedDecl>(Record, Idx);
1291ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor}
1292ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor
12937110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCallvoid ASTStmtReader::VisitSubstNonTypeTemplateParmExpr(
12947110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall                                              SubstNonTypeTemplateParmExpr *E) {
12957110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  VisitExpr(E);
1296409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->Param = ReadDeclAs<NonTypeTemplateParmDecl>(Record, Idx);
12977110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  E->NameLoc = ReadSourceLocation(Record, Idx);
12987110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  E->Replacement = Reader.ReadSubExpr();
12997110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall}
13007110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall
1301c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregorvoid ASTStmtReader::VisitSubstNonTypeTemplateParmPackExpr(
1302c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor                                          SubstNonTypeTemplateParmPackExpr *E) {
1303c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor  VisitExpr(E);
1304409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->Param = ReadDeclAs<NonTypeTemplateParmDecl>(Record, Idx);
1305c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor  TemplateArgument ArgPack = Reader.ReadTemplateArgument(F, Record, Idx);
1306c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor  if (ArgPack.getKind() != TemplateArgument::Pack)
1307c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor    return;
1308c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor
1309c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor  E->Arguments = ArgPack.pack_begin();
1310c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor  E->NumArguments = ArgPack.pack_size();
1311c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor  E->NameLoc = ReadSourceLocation(Record, Idx);
1312c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor}
1313c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor
131403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregorvoid ASTStmtReader::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {
131503e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor  VisitExpr(E);
131603e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor  E->Temporary = Reader.ReadSubExpr();
131703e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor}
131803e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor
13197cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCallvoid ASTStmtReader::VisitOpaqueValueExpr(OpaqueValueExpr *E) {
13207cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall  VisitExpr(E);
132156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  Idx++; // skip ID
1322b608b987718c6d841115464f79ab2d1820a63e17Douglas Gregor  E->Loc = ReadSourceLocation(Record, Idx);
13237cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall}
13247cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall
1325e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne//===----------------------------------------------------------------------===//
13267110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall// Microsoft Expressions and Statements
13277110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall//===----------------------------------------------------------------------===//
13287110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCallvoid ASTStmtReader::VisitCXXUuidofExpr(CXXUuidofExpr *E) {
13297110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  VisitExpr(E);
13307110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  E->setSourceRange(ReadSourceRange(Record, Idx));
13317110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  if (E->isTypeOperand()) { // __uuidof(ComType)
13327110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall    E->setTypeOperandSourceInfo(
13337110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall        GetTypeSourceInfo(Record, Idx));
13347110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall    return;
13357110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  }
13367110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall
13377110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  // __uuidof(expr)
13387110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  E->setExprOperand(Reader.ReadSubExpr());
13397110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall}
13407110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall
13417110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCallvoid ASTStmtReader::VisitSEHExceptStmt(SEHExceptStmt *S) {
13427110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  VisitStmt(S);
13437110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  S->Loc = ReadSourceLocation(Record, Idx);
13447110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  S->Children[SEHExceptStmt::FILTER_EXPR] = Reader.ReadSubStmt();
13457110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  S->Children[SEHExceptStmt::BLOCK] = Reader.ReadSubStmt();
13467110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall}
13477110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall
13487110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCallvoid ASTStmtReader::VisitSEHFinallyStmt(SEHFinallyStmt *S) {
13497110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  VisitStmt(S);
13507110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  S->Loc = ReadSourceLocation(Record, Idx);
13517110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  S->Block = Reader.ReadSubStmt();
13527110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall}
13537110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall
13547110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCallvoid ASTStmtReader::VisitSEHTryStmt(SEHTryStmt *S) {
13557110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  VisitStmt(S);
13567110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  S->IsCXXTry = Record[Idx++];
13577110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  S->TryLoc = ReadSourceLocation(Record, Idx);
13587110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  S->Children[SEHTryStmt::TRY] = Reader.ReadSubStmt();
13597110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  S->Children[SEHTryStmt::HANDLER] = Reader.ReadSubStmt();
13607110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall}
13617110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall
13627110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall//===----------------------------------------------------------------------===//
1363e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne// CUDA Expressions and Statements
1364e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne//===----------------------------------------------------------------------===//
1365e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne
1366e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbournevoid ASTStmtReader::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
1367e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  VisitCallExpr(E);
1368e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  E->setConfig(cast<CallExpr>(Reader.ReadSubExpr()));
1369e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne}
1370e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne
13717110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall//===----------------------------------------------------------------------===//
13727110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall// OpenCL Expressions and Statements.
13737110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall//===----------------------------------------------------------------------===//
13747110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCallvoid ASTStmtReader::VisitAsTypeExpr(AsTypeExpr *E) {
13757110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  VisitExpr(E);
13767110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  E->BuiltinLoc = ReadSourceLocation(Record, Idx);
13777110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  E->RParenLoc = ReadSourceLocation(Record, Idx);
13787110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  E->SrcExpr = Reader.ReadSubExpr();
13797110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall}
13807110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall
13817110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall//===----------------------------------------------------------------------===//
13827110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall// ASTReader Implementation
13837110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall//===----------------------------------------------------------------------===//
13847110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall
138572a9ae18553bf8b6bdad84d2c54f73741a47e275Douglas GregorStmt *ASTReader::ReadStmt(Module &F) {
1386919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  switch (ReadingKind) {
1387919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  case Read_Decl:
1388919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  case Read_Type:
1389c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    return ReadStmtFromStream(F);
1390919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  case Read_Stmt:
1391d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    return ReadSubStmt();
1392919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  }
1393919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
1394919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  llvm_unreachable("ReadingKind not set ?");
1395919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  return 0;
1396919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis}
1397919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
139872a9ae18553bf8b6bdad84d2c54f73741a47e275Douglas GregorExpr *ASTReader::ReadExpr(Module &F) {
1399c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  return cast_or_null<Expr>(ReadStmt(F));
1400919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis}
1401030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner
1402c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlExpr *ASTReader::ReadSubExpr() {
1403d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  return cast_or_null<Expr>(ReadSubStmt());
1404d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis}
1405d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis
140652e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner// Within the bitstream, expressions are stored in Reverse Polish
140752e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner// Notation, with each of the subexpressions preceding the
1408919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis// expression they are stored in. Subexpressions are stored from last to first.
1409919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis// To evaluate expressions, we continue reading expressions and placing them on
1410919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis// the stack, with expressions having operands removing those operands from the
141152e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner// stack. Evaluation terminates when we see a STMT_STOP record, and
141252e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner// the single remaining expression on the stack is our result.
141372a9ae18553bf8b6bdad84d2c54f73741a47e275Douglas GregorStmt *ASTReader::ReadStmtFromStream(Module &F) {
1414919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
1415919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  ReadingKindTracker ReadingKind(Read_Stmt, *this);
1416c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  llvm::BitstreamCursor &Cursor = F.DeclsCursor;
1417c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl
1418919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis#ifndef NDEBUG
1419919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  unsigned PrevNumStmts = StmtStack.size();
1420919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis#endif
1421919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
14224c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  RecordData Record;
14234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned Idx;
1424c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  ASTStmtReader Reader(*this, F, Cursor, Record, Idx);
14254c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  Stmt::EmptyShell Empty;
14264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  while (true) {
142852e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner    unsigned Code = Cursor.ReadCode();
14294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    if (Code == llvm::bitc::END_BLOCK) {
143052e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner      if (Cursor.ReadBlockEnd()) {
14313c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl        Error("error at end of block in AST file");
14324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        return 0;
14334c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      }
14344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
14364c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14374c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    if (Code == llvm::bitc::ENTER_SUBBLOCK) {
14384c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      // No known subblocks, always skip them.
143952e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner      Cursor.ReadSubBlockID();
144052e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner      if (Cursor.SkipBlock()) {
14413c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl        Error("malformed block record in AST file");
14424c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        return 0;
14434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      }
14444c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      continue;
14454c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
14464c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    if (Code == llvm::bitc::DEFINE_ABBREV) {
144852e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner      Cursor.ReadAbbrevRecord();
14494c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      continue;
14504c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
14514c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14524c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    Stmt *S = 0;
14534c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    Idx = 0;
14544c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    Record.clear();
14554c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    bool Finished = false;
14568538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    switch ((StmtCode)Cursor.ReadRecord(Code, Record)) {
14578538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_STOP:
14584c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      Finished = true;
14594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14604c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14618538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_NULL_PTR:
14621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      S = 0;
14634c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14644c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14658538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_NULL:
14664c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) NullStmt(Empty);
14674c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14684c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14698538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_COMPOUND:
14704c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) CompoundStmt(Empty);
14714c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14724c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14738538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_CASE:
14744c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) CaseStmt(Empty);
14754c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14778538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_DEFAULT:
14784c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) DefaultStmt(Empty);
14794c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14804c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14818538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_LABEL:
14824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) LabelStmt(Empty);
14834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14858538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_IF:
14864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) IfStmt(Empty);
14874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14884c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14898538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_SWITCH:
14904c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) SwitchStmt(Empty);
14914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14924c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14938538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_WHILE:
14944c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) WhileStmt(Empty);
14954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14964c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14978538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_DO:
14984c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) DoStmt(Empty);
14994c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15018538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_FOR:
15024c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ForStmt(Empty);
15034c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15044c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15058538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_GOTO:
15064c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) GotoStmt(Empty);
15074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15098538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_INDIRECT_GOTO:
15104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) IndirectGotoStmt(Empty);
15114c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15124c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15138538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_CONTINUE:
15144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ContinueStmt(Empty);
15154c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15164c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15178538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_BREAK:
15184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) BreakStmt(Empty);
15194c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15204c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15218538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_RETURN:
15224c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ReturnStmt(Empty);
15234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15258538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_DECL:
15264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) DeclStmt(Empty);
15274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15298538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_ASM:
15304c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) AsmStmt(Empty);
15314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15338538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_PREDEFINED:
15344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) PredefinedExpr(Empty);
15354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15378538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_DECL_REF:
15383aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth      S = DeclRefExpr::CreateEmpty(
15393aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth        *Context,
15403aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth        /*HasQualifier=*/Record[ASTStmtReader::NumExprFields],
15413aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth        /*HasFoundDecl=*/Record[ASTStmtReader::NumExprFields + 1],
15423aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth        /*HasExplicitTemplateArgs=*/Record[ASTStmtReader::NumExprFields + 2],
15433aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth        /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields + 2] ?
15443aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth          Record[ASTStmtReader::NumExprFields + 3] : 0);
15454c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15478538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_INTEGER_LITERAL:
15489996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis      S = IntegerLiteral::Create(*Context, Empty);
15494c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15518538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_FLOATING_LITERAL:
15529996a7f06a3c5b4554692e7177930cf4e8ef09afArgyrios Kyrtzidis      S = FloatingLiteral::Create(*Context, Empty);
15534c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15558538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_IMAGINARY_LITERAL:
15564c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ImaginaryLiteral(Empty);
15574c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15584c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15598538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_STRING_LITERAL:
15601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      S = StringLiteral::CreateEmpty(*Context,
156160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                     Record[ASTStmtReader::NumExprFields + 1]);
15624c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15634c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15648538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CHARACTER_LITERAL:
15654c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) CharacterLiteral(Empty);
15664c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15674c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15688538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_PAREN:
15694c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ParenExpr(Empty);
15704c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15714c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15728538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_PAREN_LIST:
157337bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis      S = new (Context) ParenListExpr(Empty);
157437bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis      break;
157537bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis
15768538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_UNARY_OPERATOR:
15774c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) UnaryOperator(Empty);
15784c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15794c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15808538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OFFSETOF:
15818ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      S = OffsetOfExpr::CreateEmpty(*Context,
158260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                    Record[ASTStmtReader::NumExprFields],
158360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                    Record[ASTStmtReader::NumExprFields + 1]);
15848ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
15858ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
15868538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_SIZEOF_ALIGN_OF:
1587f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne      S = new (Context) UnaryExprOrTypeTraitExpr(Empty);
15884c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15908538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_ARRAY_SUBSCRIPT:
15914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ArraySubscriptExpr(Empty);
15924c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15948538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CALL:
1595ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis      S = new (Context) CallExpr(*Context, Stmt::CallExprClass, Empty);
15964c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15974c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15988538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_MEMBER: {
1599663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      // We load everything here and fully initialize it at creation.
1600663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      // That way we can use MemberExpr::Create and don't have to duplicate its
1601663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      // logic with a MemberExpr::CreateEmpty.
1602663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
1603663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      assert(Idx == 0);
160440d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor      NestedNameSpecifierLoc QualifierLoc;
1605663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      if (Record[Idx++]) { // HasQualifier.
160640d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor        QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
1607663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      }
1608663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
1609663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      TemplateArgumentListInfo ArgInfo;
1610def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor      bool HasExplicitTemplateArgs = Record[Idx++];
1611def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor      if (HasExplicitTemplateArgs) {
1612def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor        unsigned NumTemplateArgs = Record[Idx++];
1613c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        ArgInfo.setLAngleLoc(ReadSourceLocation(F, Record, Idx));
1614c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        ArgInfo.setRAngleLoc(ReadSourceLocation(F, Record, Idx));
1615663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis        for (unsigned i = 0; i != NumTemplateArgs; ++i)
1616c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl          ArgInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Idx));
1617663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      }
1618663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
1619409448c832d27703146b70a1137d86b020f29863Douglas Gregor      NamedDecl *FoundD = ReadDeclAs<NamedDecl>(F, Record, Idx);
1620663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
1621663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      DeclAccessPair FoundDecl = DeclAccessPair::make(FoundD, AS);
1622663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
1623393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor      QualType T = readType(F, Record, Idx);
1624f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      ExprValueKind VK = static_cast<ExprValueKind>(Record[Idx++]);
1625f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      ExprObjectKind OK = static_cast<ExprObjectKind>(Record[Idx++]);
1626663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      Expr *Base = ReadSubExpr();
1627409448c832d27703146b70a1137d86b020f29863Douglas Gregor      ValueDecl *MemberD = ReadDeclAs<ValueDecl>(F, Record, Idx);
1628c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      SourceLocation MemberLoc = ReadSourceLocation(F, Record, Idx);
16292577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      DeclarationNameInfo MemberNameInfo(MemberD->getDeclName(), MemberLoc);
1630663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      bool IsArrow = Record[Idx++];
1631663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
163240d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor      S = MemberExpr::Create(*Context, Base, IsArrow, QualifierLoc,
16332577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                             MemberD, FoundDecl, MemberNameInfo,
1634def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                             HasExplicitTemplateArgs ? &ArgInfo : 0, T, VK, OK);
16354045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis      ReadDeclarationNameLoc(F, cast<MemberExpr>(S)->MemberDNLoc,
16364045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis                             MemberD->getDeclName(), Record, Idx);
16374c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
1638663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis    }
16394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
16408538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_BINARY_OPERATOR:
16414c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) BinaryOperator(Empty);
16424c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
16448538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_COMPOUND_ASSIGN_OPERATOR:
16454c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) CompoundAssignOperator(Empty);
16464c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
16488538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CONDITIONAL_OPERATOR:
16494c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ConditionalOperator(Empty);
16504c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16514c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
165256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    case EXPR_BINARY_CONDITIONAL_OPERATOR:
165356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      S = new (Context) BinaryConditionalOperator(Empty);
165456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      break;
165556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
16568538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_IMPLICIT_CAST:
1657f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      S = ImplicitCastExpr::CreateEmpty(*Context,
165860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
16594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16604c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
16618538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CSTYLE_CAST:
1662f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      S = CStyleCastExpr::CreateEmpty(*Context,
166360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
16644c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16654c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
16668538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_COMPOUND_LITERAL:
16674c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) CompoundLiteralExpr(Empty);
16684c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16694c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
16708538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_EXT_VECTOR_ELEMENT:
16714c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ExtVectorElementExpr(Empty);
16724c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16734c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
16748538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_INIT_LIST:
1675709210feee317b8d6690dd1d15c2b74cfe55e261Ted Kremenek      S = new (Context) InitListExpr(*getContext(), Empty);
16764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16774c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
16788538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_DESIGNATED_INIT:
1679d1d64a027554b635d644957ef071ec04ea1f7063Chris Lattner      S = DesignatedInitExpr::CreateEmpty(*Context,
168060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                     Record[ASTStmtReader::NumExprFields] - 1);
16811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
16824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
16848538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_IMPLICIT_VALUE_INIT:
16854c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ImplicitValueInitExpr(Empty);
16864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
16888538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_VA_ARG:
16894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) VAArgExpr(Empty);
16904c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
16928538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_ADDR_LABEL:
16934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) AddrLabelExpr(Empty);
16944c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
16968538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_STMT:
16974c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) StmtExpr(Empty);
16984c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16994c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
17008538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CHOOSE:
17014c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ChooseExpr(Empty);
17024c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17034c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
17048538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_GNU_NULL:
17054c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) GNUNullExpr(Empty);
17064c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
17088538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_SHUFFLE_VECTOR:
17094c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ShuffleVectorExpr(Empty);
17104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17128538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_BLOCK:
17134c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) BlockExpr(Empty);
17144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17154c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
17168538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_BLOCK_DECL_REF:
17174c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) BlockDeclRefExpr(Empty);
17184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1720f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    case EXPR_GENERIC_SELECTION:
1721f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne      S = new (Context) GenericSelectionExpr(Empty);
1722f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne      break;
1723f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
17248538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_STRING_LITERAL:
17254c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCStringLiteral(Empty);
17264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17278538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_ENCODE:
17284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCEncodeExpr(Empty);
17294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17308538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_SELECTOR_EXPR:
17314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCSelectorExpr(Empty);
17324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17338538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_PROTOCOL_EXPR:
17344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCProtocolExpr(Empty);
17354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17368538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_IVAR_REF_EXPR:
17374c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCIvarRefExpr(Empty);
17384c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17398538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_PROPERTY_REF_EXPR:
17404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCPropertyRefExpr(Empty);
17414c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17428538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_KVC_REF_EXPR:
174312f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall      llvm_unreachable("mismatching AST file");
17444c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17458538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_MESSAGE_EXPR:
174604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor      S = ObjCMessageExpr::CreateEmpty(*Context,
174760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                     Record[ASTStmtReader::NumExprFields]);
17484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17498538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_ISA:
1750f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff      S = new (Context) ObjCIsaExpr(Empty);
1751f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff      break;
1752f85e193739c953358c865005855253af4f68a497John McCall    case EXPR_OBJC_INDIRECT_COPY_RESTORE:
1753f85e193739c953358c865005855253af4f68a497John McCall      S = new (Context) ObjCIndirectCopyRestoreExpr(Empty);
1754f85e193739c953358c865005855253af4f68a497John McCall      break;
1755f85e193739c953358c865005855253af4f68a497John McCall    case EXPR_OBJC_BRIDGED_CAST:
1756f85e193739c953358c865005855253af4f68a497John McCall      S = new (Context) ObjCBridgedCastExpr(Empty);
1757f85e193739c953358c865005855253af4f68a497John McCall      break;
17588538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_FOR_COLLECTION:
17594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCForCollectionStmt(Empty);
17604c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17618538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_CATCH:
17624c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCAtCatchStmt(Empty);
17634c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17648538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_FINALLY:
17654c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCAtFinallyStmt(Empty);
17664c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17678538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_AT_TRY:
17688f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor      S = ObjCAtTryStmt::CreateEmpty(*Context,
176960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                     Record[ASTStmtReader::NumStmtFields],
177060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                     Record[ASTStmtReader::NumStmtFields + 1]);
17714c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17728538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_AT_SYNCHRONIZED:
17734c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCAtSynchronizedStmt(Empty);
17744c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17758538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_AT_THROW:
17764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCAtThrowStmt(Empty);
17774c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
1778f85e193739c953358c865005855253af4f68a497John McCall    case STMT_OBJC_AUTORELEASE_POOL:
1779f85e193739c953358c865005855253af4f68a497John McCall      S = new (Context) ObjCAutoreleasePoolStmt(Empty);
1780f85e193739c953358c865005855253af4f68a497John McCall      break;
17817110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall    case STMT_SEH_EXCEPT:
17827110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall      S = new (Context) SEHExceptStmt(Empty);
17837110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall      break;
17847110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall    case STMT_SEH_FINALLY:
17857110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall      S = new (Context) SEHFinallyStmt(Empty);
17867110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall      break;
17877110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall    case STMT_SEH_TRY:
17887110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall      S = new (Context) SEHTryStmt(Empty);
17897110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall      break;
17908538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_CXX_CATCH:
17917cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis      S = new (Context) CXXCatchStmt(Empty);
17927cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis      break;
17937cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis
17948538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_CXX_TRY:
17957cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis      S = CXXTryStmt::Create(*Context, Empty,
179660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl             /*NumHandlers=*/Record[ASTStmtReader::NumStmtFields]);
17977cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis      break;
17987cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis
1799ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith    case STMT_CXX_FOR_RANGE:
1800ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith      S = new (Context) CXXForRangeStmt(Empty);
1801ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith      break;
1802ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith
18038538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_OPERATOR_CALL:
1804ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis      S = new (Context) CXXOperatorCallExpr(*Context, Empty);
1805ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis      break;
18061817bd483b538fd3f4530649f5cb900bad9e8a76Chris Lattner
18078538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_MEMBER_CALL:
18081817bd483b538fd3f4530649f5cb900bad9e8a76Chris Lattner      S = new (Context) CXXMemberCallExpr(*Context, Empty);
18091817bd483b538fd3f4530649f5cb900bad9e8a76Chris Lattner      break;
181039da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor
18118538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_CONSTRUCT:
18126d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis      S = new (Context) CXXConstructExpr(Empty);
18136d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis      break;
18146d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis
18158538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_TEMPORARY_OBJECT:
18166d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis      S = new (Context) CXXTemporaryObjectExpr(Empty);
181739da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor      break;
1818ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
18198538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_STATIC_CAST:
1820f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      S = CXXStaticCastExpr::CreateEmpty(*Context,
182160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1822ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig      break;
1823ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
18248538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_DYNAMIC_CAST:
1825f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      S = CXXDynamicCastExpr::CreateEmpty(*Context,
182660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1827ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig      break;
1828ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
18298538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_REINTERPRET_CAST:
1830f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      S = CXXReinterpretCastExpr::CreateEmpty(*Context,
183160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1832ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig      break;
1833ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
18348538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_CONST_CAST:
1835f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      S = CXXConstCastExpr::CreateEmpty(*Context);
1836ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig      break;
1837ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
18388538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_FUNCTIONAL_CAST:
1839f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      S = CXXFunctionalCastExpr::CreateEmpty(*Context,
184060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1841ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig      break;
1842ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
18438538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_BOOL_LITERAL:
1844eb7f96141f754150a92433286fa385910a22f494Sam Weinig      S = new (Context) CXXBoolLiteralExpr(Empty);
1845eb7f96141f754150a92433286fa385910a22f494Sam Weinig      break;
1846ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
18478538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_NULL_PTR_LITERAL:
1848eb7f96141f754150a92433286fa385910a22f494Sam Weinig      S = new (Context) CXXNullPtrLiteralExpr(Empty);
1849eb7f96141f754150a92433286fa385910a22f494Sam Weinig      break;
18508538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_TYPEID_EXPR:
185114ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner      S = new (Context) CXXTypeidExpr(Empty, true);
185214ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner      break;
18538538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_TYPEID_TYPE:
185414ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner      S = new (Context) CXXTypeidExpr(Empty, false);
185514ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner      break;
185601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    case EXPR_CXX_UUIDOF_EXPR:
185701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet      S = new (Context) CXXUuidofExpr(Empty, true);
185801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet      break;
185901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    case EXPR_CXX_UUIDOF_TYPE:
186001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet      S = new (Context) CXXUuidofExpr(Empty, false);
186101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet      break;
18628538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_THIS:
18632fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner      S = new (Context) CXXThisExpr(Empty);
18642fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner      break;
18658538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_THROW:
18662fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner      S = new (Context) CXXThrowExpr(Empty);
18672fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner      break;
18688538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_DEFAULT_ARG: {
186960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl      bool HasOtherExprStored = Record[ASTStmtReader::NumExprFields];
18708a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis      if (HasOtherExprStored) {
18718a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis        Expr *SubExpr = ReadSubExpr();
18728a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis        S = CXXDefaultArgExpr::Create(*Context, SourceLocation(), 0, SubExpr);
18738a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis      } else
18748a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis        S = new (Context) CXXDefaultArgExpr(Empty);
1875030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner      break;
18768a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis    }
18778538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_BIND_TEMPORARY:
1878d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner      S = new (Context) CXXBindTemporaryExpr(Empty);
1879d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner      break;
1880e2ca6d4a2f41876930fbd304caa706452d2569d8Douglas Gregor
18818538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_SCALAR_VALUE_INIT:
1882ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor      S = new (Context) CXXScalarValueInitExpr(Empty);
18835921863d8f24084797863b5df37842113bac4352Chris Lattner      break;
18848538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_NEW:
18855921863d8f24084797863b5df37842113bac4352Chris Lattner      S = new (Context) CXXNewExpr(Empty);
18865921863d8f24084797863b5df37842113bac4352Chris Lattner      break;
18878538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_DELETE:
188895fc98ce95d4faa4f1bb2783384150530404ea6fArgyrios Kyrtzidis      S = new (Context) CXXDeleteExpr(Empty);
188995fc98ce95d4faa4f1bb2783384150530404ea6fArgyrios Kyrtzidis      break;
18908538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_PSEUDO_DESTRUCTOR:
1891de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis      S = new (Context) CXXPseudoDestructorExpr(Empty);
1892de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis      break;
18935921863d8f24084797863b5df37842113bac4352Chris Lattner
18944765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall    case EXPR_EXPR_WITH_CLEANUPS:
18954765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall      S = new (Context) ExprWithCleanups(Empty);
1896d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner      break;
18978dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
18988538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_DEPENDENT_SCOPE_MEMBER:
18998dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis      S = CXXDependentScopeMemberExpr::CreateEmpty(*Context,
1900def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor          /*HasExplicitTemplateArgs=*/Record[ASTStmtReader::NumExprFields],
1901def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                  /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]
1902def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                   ? Record[ASTStmtReader::NumExprFields + 1]
1903def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                   : 0);
19048dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis      break;
19058dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
19068538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_DEPENDENT_SCOPE_DECL_REF:
190712dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis      S = DependentScopeDeclRefExpr::CreateEmpty(*Context,
1908def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor          /*HasExplicitTemplateArgs=*/Record[ASTStmtReader::NumExprFields],
1909def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                  /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]
1910def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                   ? Record[ASTStmtReader::NumExprFields + 1]
1911def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                   : 0);
191212dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis      break;
191312dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis
19148538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_UNRESOLVED_CONSTRUCT:
19158dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis      S = CXXUnresolvedConstructExpr::CreateEmpty(*Context,
191660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                              /*NumArgs=*/Record[ASTStmtReader::NumExprFields]);
1917a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis      break;
1918a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
19198538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_UNRESOLVED_MEMBER:
1920a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis      S = UnresolvedMemberExpr::CreateEmpty(*Context,
1921def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor          /*HasExplicitTemplateArgs=*/Record[ASTStmtReader::NumExprFields],
1922def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                  /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]
1923def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                   ? Record[ASTStmtReader::NumExprFields + 1]
1924def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                   : 0);
19258dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis      break;
1926bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis
19278538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_UNRESOLVED_LOOKUP:
1928bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis      S = UnresolvedLookupExpr::CreateEmpty(*Context,
1929def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor          /*HasExplicitTemplateArgs=*/Record[ASTStmtReader::NumExprFields],
1930def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                  /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]
1931def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                   ? Record[ASTStmtReader::NumExprFields + 1]
1932def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                   : 0);
1933bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis      break;
19346d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis
19358538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_UNARY_TYPE_TRAIT:
19366d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis      S = new (Context) UnaryTypeTraitExpr(Empty);
19376d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis      break;
19386b219d082434394c1ac401390ec1d1967727815aSebastian Redl
1939f187237d916afa97c491ac32fe98be7d335c5b63Francois Pichet    case EXPR_BINARY_TYPE_TRAIT:
19406ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet      S = new (Context) BinaryTypeTraitExpr(Empty);
19416ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet      break;
19426ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet
194321ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley    case EXPR_ARRAY_TYPE_TRAIT:
194421ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley      S = new (Context) ArrayTypeTraitExpr(Empty);
194521ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley      break;
194621ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley
1947552622067dc45013d240f73952fece703f5e63bdJohn Wiegley    case EXPR_CXX_EXPRESSION_TRAIT:
1948552622067dc45013d240f73952fece703f5e63bdJohn Wiegley      S = new (Context) ExpressionTraitExpr(Empty);
1949552622067dc45013d240f73952fece703f5e63bdJohn Wiegley      break;
1950552622067dc45013d240f73952fece703f5e63bdJohn Wiegley
19516b219d082434394c1ac401390ec1d1967727815aSebastian Redl    case EXPR_CXX_NOEXCEPT:
19526b219d082434394c1ac401390ec1d1967727815aSebastian Redl      S = new (Context) CXXNoexceptExpr(Empty);
19536b219d082434394c1ac401390ec1d1967727815aSebastian Redl      break;
19547cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall
1955be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor    case EXPR_PACK_EXPANSION:
1956be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor      S = new (Context) PackExpansionExpr(Empty);
1957be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor      break;
1958be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor
1959ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor    case EXPR_SIZEOF_PACK:
1960ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor      S = new (Context) SizeOfPackExpr(Empty);
1961ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor      break;
1962ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor
19637110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall    case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM:
19647110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall      S = new (Context) SubstNonTypeTemplateParmExpr(Empty);
19657110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall      break;
19667110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall
1967c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor    case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK:
1968c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor      S = new (Context) SubstNonTypeTemplateParmPackExpr(Empty);
1969c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor      break;
1970c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor
197103e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    case EXPR_MATERIALIZE_TEMPORARY:
197203e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor      S = new (Context) MaterializeTemporaryExpr(Empty);
197303e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor      break;
197403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor
197556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    case EXPR_OPAQUE_VALUE: {
197656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      unsigned key = Record[ASTStmtReader::NumExprFields];
197756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      OpaqueValueExpr *&expr = OpaqueValueExprs[key];
197856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
197956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      // If we already have an entry for this opaque value expression,
198056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      // don't bother reading it again.
198156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      if (expr) {
198256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall        StmtStack.push_back(expr);
198356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall        continue;
198456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      }
198556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
198656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      S = expr = new (Context) OpaqueValueExpr(Empty);
19877cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall      break;
198856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    }
1989e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne
1990e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne    case EXPR_CUDA_KERNEL_CALL:
1991e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne      S = new (Context) CUDAKernelCallExpr(*Context, Empty);
1992e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne      break;
199361eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner
199461eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner    case EXPR_ASTYPE:
199561eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner      S = new (Context) AsTypeExpr(Empty);
199661eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner      break;
19974c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
19986d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis
19994c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    // We hit a STMT_STOP, so we're done with this expression.
20004c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    if (Finished)
20014c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
20024c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
20034c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    ++NumStatementsRead;
20044c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
2005919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    if (S)
2006919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis      Reader.Visit(S);
20074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
20084c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    assert(Idx == Record.size() && "Invalid deserialization of statement");
20094c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    StmtStack.push_back(S);
20104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
2011919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
2012919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis#ifndef NDEBUG
2013919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  assert(StmtStack.size() > PrevNumStmts && "Read too many sub stmts!");
2014919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  assert(StmtStack.size() == PrevNumStmts + 1 && "Extra expressions on stack!");
2015919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis#endif
2016919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
2017919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  return StmtStack.pop_back_val();
20184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2019