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.
83b0c3e0909bb04af0bfb82ad01ab6909649d68ccaArgyrios Kyrtzidis    void ReadExplicitTemplateArgumentList(ASTTemplateArgumentListInfo &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::
94b0c3e0909bb04af0bfb82ad01ab6909649d68ccaArgyrios KyrtzidisReadExplicitTemplateArgumentList(ASTTemplateArgumentListInfo &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));
112e2ca828119b8bff4a5c25c6db8ee4fec558451e7Argyrios Kyrtzidis  S->HasLeadingEmptyMacro = 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());
121359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor  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);
159359427794704666ff7a5a933ace11c5256fa3af7Douglas 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);
170359427794704666ff7a5a933ace11c5256fa3af7Douglas 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);
192359427794704666ff7a5a933ace11c5256fa3af7Douglas 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());
213359427794704666ff7a5a933ace11c5256fa3af7Douglas 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));
266359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    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) {
29095eab176f51beed44a9bc14c0dcdd37844b23740Douglas Gregor    Names.push_back(Reader.GetIdentifierInfo(F, 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
300359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor  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++];
3307cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara  E->DeclRefExprBits.HadMultipleCandidates = Record[Idx++];
331b0ca137bf399d956a3424816c238bc2532250d17Anders Carlsson  unsigned NumTemplateArgs = 0;
332cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth  if (E->hasExplicitTemplateArgs())
333b0ca137bf399d956a3424816c238bc2532250d17Anders Carlsson    NumTemplateArgs = Record[Idx++];
334b0ca137bf399d956a3424816c238bc2532250d17Anders Carlsson
335cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth  if (E->hasQualifier())
3366857c3e12c86fd0271eb46baab5b18756a94f4cbChandler Carruth    E->getInternalQualifierLoc()
33740d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor      = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
338663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
3393aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth  if (E->hasFoundDecl())
340409448c832d27703146b70a1137d86b020f29863Douglas Gregor    E->getInternalFoundDecl() = ReadDeclAs<NamedDecl>(Record, Idx);
3413aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth
342cb66cff8fdf641f57f85dedb515a5f3240e3a9bbChandler Carruth  if (E->hasExplicitTemplateArgs())
343096832c5ed5b9106fa177ebc148489760c3bc496John McCall    ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),
344663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis                                     NumTemplateArgs);
345663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
346409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->setDecl(ReadDeclAs<ValueDecl>(Record, Idx));
347c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLocation(ReadSourceLocation(Record, Idx));
3484045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  ReadDeclarationNameLoc(E->DNLoc, E->getDecl()->getDeclName(), Record, Idx);
3494c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3504c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
35160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitIntegerLiteral(IntegerLiteral *E) {
3524c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
353c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLocation(ReadSourceLocation(Record, Idx));
354359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor  E->setValue(Reader.getContext(), Reader.ReadAPInt(Record, Idx));
3554c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3564c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
35760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitFloatingLiteral(FloatingLiteral *E) {
3584c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
359359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor  E->setValue(Reader.getContext(), Reader.ReadAPFloat(Record, Idx));
3604c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setExact(Record[Idx++]);
361c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLocation(ReadSourceLocation(Record, Idx));
3624c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3634c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
36460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitImaginaryLiteral(ImaginaryLiteral *E) {
3654c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
366d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
3674c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3684c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
36960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitStringLiteral(StringLiteral *E) {
3704c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
3714c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned Len = Record[Idx++];
3721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  assert(Record[Idx] == E->getNumConcatenated() &&
3734c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner         "Wrong number of concatenated tokens!");
3744c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  ++Idx;
3755cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor  E->Kind = static_cast<StringLiteral::StringKind>(Record[Idx++]);
3763e2193ce5feb2feb092e5ae615e85148e06e9fd2Anders Carlsson  E->IsPascal = Record[Idx++];
3774c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
3781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Read string data
379b648023da23e8b227cdda57a241db4c6f368726bDaniel Dunbar  llvm::SmallString<16> Str(&Record[Idx], &Record[Idx] + Len);
380359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor  E->setString(Reader.getContext(), Str.str());
3814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  Idx += Len;
3824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
3834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  // Read source locations
3844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0, N = E->getNumConcatenated(); I != N; ++I)
385c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    E->setStrTokenLoc(I, ReadSourceLocation(Record, Idx));
3864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
38860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCharacterLiteral(CharacterLiteral *E) {
3894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
3904c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setValue(Record[Idx++]);
391c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLocation(ReadSourceLocation(Record, Idx));
3925cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor  E->setKind(static_cast<CharacterLiteral::CharacterKind>(Record[Idx++]));
3934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
3944c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
39560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitParenExpr(ParenExpr *E) {
3964c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
397c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLParen(ReadSourceLocation(Record, Idx));
398c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRParen(ReadSourceLocation(Record, Idx));
399d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
4004c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4014c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
40260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitParenListExpr(ParenListExpr *E) {
40337bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  VisitExpr(E);
40437bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  unsigned NumExprs = Record[Idx++];
405359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor  E->Exprs = new (Reader.getContext()) Stmt*[NumExprs];
40637bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  for (unsigned i = 0; i != NumExprs; ++i)
40737bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis    E->Exprs[i] = Reader.ReadSubStmt();
40837bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis  E->NumExprs = NumExprs;
409c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->LParenLoc = ReadSourceLocation(Record, Idx);
410c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->RParenLoc = ReadSourceLocation(Record, Idx);
41137bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis}
41237bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis
41360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitUnaryOperator(UnaryOperator *E) {
4144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
415d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
4164c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setOpcode((UnaryOperator::Opcode)Record[Idx++]);
417c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setOperatorLoc(ReadSourceLocation(Record, Idx));
4184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4194c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
42060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitOffsetOfExpr(OffsetOfExpr *E) {
4218ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  typedef OffsetOfExpr::OffsetOfNode Node;
4228ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  VisitExpr(E);
4238ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  assert(E->getNumComponents() == Record[Idx]);
4248ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  ++Idx;
4258ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  assert(E->getNumExpressions() == Record[Idx]);
4268ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  ++Idx;
427c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setOperatorLoc(ReadSourceLocation(Record, Idx));
428c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRParenLoc(ReadSourceLocation(Record, Idx));
429c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setTypeSourceInfo(GetTypeSourceInfo(Record, Idx));
4308ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
4318ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    Node::Kind Kind = static_cast<Node::Kind>(Record[Idx++]);
432c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SourceLocation Start = ReadSourceLocation(Record, Idx);
433c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SourceLocation End = ReadSourceLocation(Record, Idx);
4348ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    switch (Kind) {
4358ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Array:
4368ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      E->setComponent(I, Node(Start, Record[Idx++], End));
4378ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
4388ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
4398ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Field:
440409448c832d27703146b70a1137d86b020f29863Douglas Gregor      E->setComponent(I, Node(Start, ReadDeclAs<FieldDecl>(Record, Idx), End));
4418ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
4428ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
4438ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    case Node::Identifier:
44495eab176f51beed44a9bc14c0dcdd37844b23740Douglas Gregor      E->setComponent(I,
44595eab176f51beed44a9bc14c0dcdd37844b23740Douglas Gregor                      Node(Start,
44695eab176f51beed44a9bc14c0dcdd37844b23740Douglas Gregor                           Reader.GetIdentifierInfo(F, Record, Idx),
44795eab176f51beed44a9bc14c0dcdd37844b23740Douglas Gregor                           End));
4488ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
449cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor
450afbf3127cbdebc7d3d8711c51b1d013afa57e849Argyrios Kyrtzidis    case Node::Base: {
451359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      CXXBaseSpecifier *Base = new (Reader.getContext()) CXXBaseSpecifier();
452c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      *Base = Reader.ReadCXXBaseSpecifier(F, Record, Idx);
453afbf3127cbdebc7d3d8711c51b1d013afa57e849Argyrios Kyrtzidis      E->setComponent(I, Node(Base));
454cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      break;
4558ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
456afbf3127cbdebc7d3d8711c51b1d013afa57e849Argyrios Kyrtzidis    }
4578ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
4588ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
4598ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  for (unsigned I = 0, N = E->getNumExpressions(); I != N; ++I)
460d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setIndexExpr(I, Reader.ReadSubExpr());
4618ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
4628ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
463f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbournevoid ASTStmtReader::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) {
4644c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
465f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  E->setKind(static_cast<UnaryExprOrTypeTrait>(Record[Idx++]));
4664c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  if (Record[Idx] == 0) {
467d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setArgument(Reader.ReadSubExpr());
4684c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    ++Idx;
4694c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  } else {
470c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    E->setArgument(GetTypeSourceInfo(Record, Idx));
4714c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
472c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setOperatorLoc(ReadSourceLocation(Record, Idx));
473c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRParenLoc(ReadSourceLocation(Record, Idx));
4744c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4754c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
47660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
4774c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
478d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setLHS(Reader.ReadSubExpr());
479d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setRHS(Reader.ReadSubExpr());
480c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRBracketLoc(ReadSourceLocation(Record, Idx));
4814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
48360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCallExpr(CallExpr *E) {
4844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
485359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor  E->setNumArgs(Reader.getContext(), Record[Idx++]);
486c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRParenLoc(ReadSourceLocation(Record, Idx));
487d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setCallee(Reader.ReadSubExpr());
4884c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
489d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setArg(I, Reader.ReadSubExpr());
4904c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
4914c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
4927110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCallvoid ASTStmtReader::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
4937110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  VisitCallExpr(E);
4947110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall}
4957110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall
49660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitMemberExpr(MemberExpr *E) {
497663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  // Don't call VisitExpr, this is fully initialized at creation.
498663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis  assert(E->getStmtClass() == Stmt::MemberExprClass &&
499663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis         "It's a subclass, we must advance Idx!");
5004c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5014c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
50260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCIsaExpr(ObjCIsaExpr *E) {
503f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff  VisitExpr(E);
504d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
505c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setIsaMemberLoc(ReadSourceLocation(Record, Idx));
506f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff  E->setArrow(Record[Idx++]);
507f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff}
508f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff
509f85e193739c953358c865005855253af4f68a497John McCallvoid ASTStmtReader::
510f85e193739c953358c865005855253af4f68a497John McCallVisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
511f85e193739c953358c865005855253af4f68a497John McCall  VisitExpr(E);
512f85e193739c953358c865005855253af4f68a497John McCall  E->Operand = Reader.ReadSubExpr();
513f85e193739c953358c865005855253af4f68a497John McCall  E->setShouldCopy(Record[Idx++]);
514f85e193739c953358c865005855253af4f68a497John McCall}
515f85e193739c953358c865005855253af4f68a497John McCall
516f85e193739c953358c865005855253af4f68a497John McCallvoid ASTStmtReader::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
517f85e193739c953358c865005855253af4f68a497John McCall  VisitExplicitCastExpr(E);
518f85e193739c953358c865005855253af4f68a497John McCall  E->LParenLoc = ReadSourceLocation(Record, Idx);
519f85e193739c953358c865005855253af4f68a497John McCall  E->BridgeKeywordLoc = ReadSourceLocation(Record, Idx);
520f85e193739c953358c865005855253af4f68a497John McCall  E->Kind = Record[Idx++];
521f85e193739c953358c865005855253af4f68a497John McCall}
522f85e193739c953358c865005855253af4f68a497John McCall
52360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCastExpr(CastExpr *E) {
5244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
525f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  unsigned NumBaseSpecs = Record[Idx++];
526f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  assert(NumBaseSpecs == E->path_size());
527d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
528cdef2b75aa60cde1ca00e0aa3f89139ac89c6ae4Anders Carlsson  E->setCastKind((CastExpr::CastKind)Record[Idx++]);
529f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  CastExpr::path_iterator BaseI = E->path_begin();
5300745d0a648b75bd304045309276c70a755adaafbArgyrios Kyrtzidis  while (NumBaseSpecs--) {
531359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    CXXBaseSpecifier *BaseSpec = new (Reader.getContext()) CXXBaseSpecifier;
532c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    *BaseSpec = Reader.ReadCXXBaseSpecifier(F, Record, Idx);
533f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    *BaseI++ = BaseSpec;
5340745d0a648b75bd304045309276c70a755adaafbArgyrios Kyrtzidis  }
5354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5364c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
53760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitBinaryOperator(BinaryOperator *E) {
5384c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
539d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setLHS(Reader.ReadSubExpr());
540d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setRHS(Reader.ReadSubExpr());
5414c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setOpcode((BinaryOperator::Opcode)Record[Idx++]);
542c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setOperatorLoc(ReadSourceLocation(Record, Idx));
5434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5444c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
54560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCompoundAssignOperator(CompoundAssignOperator *E) {
5464c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitBinaryOperator(E);
547393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor  E->setComputationLHSType(Reader.readType(F, Record, Idx));
548393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor  E->setComputationResultType(Reader.readType(F, Record, Idx));
5494c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5504c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
55160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitConditionalOperator(ConditionalOperator *E) {
5524c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
55356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  E->SubExprs[ConditionalOperator::COND] = Reader.ReadSubExpr();
55456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  E->SubExprs[ConditionalOperator::LHS] = Reader.ReadSubExpr();
55556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  E->SubExprs[ConditionalOperator::RHS] = Reader.ReadSubExpr();
55656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  E->QuestionLoc = ReadSourceLocation(Record, Idx);
55756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  E->ColonLoc = ReadSourceLocation(Record, Idx);
55856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall}
55956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
56056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallvoid
56156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallASTStmtReader::VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {
56256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  VisitExpr(E);
56356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  E->OpaqueValue = cast<OpaqueValueExpr>(Reader.ReadSubExpr());
56456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  E->SubExprs[BinaryConditionalOperator::COMMON] = Reader.ReadSubExpr();
56556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  E->SubExprs[BinaryConditionalOperator::COND] = Reader.ReadSubExpr();
56656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  E->SubExprs[BinaryConditionalOperator::LHS] = Reader.ReadSubExpr();
56756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  E->SubExprs[BinaryConditionalOperator::RHS] = Reader.ReadSubExpr();
56856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  E->QuestionLoc = ReadSourceLocation(Record, Idx);
56956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  E->ColonLoc = ReadSourceLocation(Record, Idx);
57056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
57156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  E->getOpaqueValue()->setSourceExpr(E->getCommon());
5724c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5734c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
57460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitImplicitCastExpr(ImplicitCastExpr *E) {
5754c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitCastExpr(E);
5764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5774c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
57860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitExplicitCastExpr(ExplicitCastExpr *E) {
5794c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitCastExpr(E);
580c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setTypeInfoAsWritten(GetTypeSourceInfo(Record, Idx));
5814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
58360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCStyleCastExpr(CStyleCastExpr *E) {
5844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExplicitCastExpr(E);
585c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLParenLoc(ReadSourceLocation(Record, Idx));
586c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRParenLoc(ReadSourceLocation(Record, Idx));
5874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5884c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
58960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
5904c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
591c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLParenLoc(ReadSourceLocation(Record, Idx));
592c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setTypeSourceInfo(GetTypeSourceInfo(Record, Idx));
593d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setInitializer(Reader.ReadSubExpr());
5944c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setFileScope(Record[Idx++]);
5954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
5964c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
59760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
5984c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
599d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
60095eab176f51beed44a9bc14c0dcdd37844b23740Douglas Gregor  E->setAccessor(Reader.GetIdentifierInfo(F, Record, Idx));
601c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setAccessorLoc(ReadSourceLocation(Record, Idx));
6024c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
6034c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
60460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitInitListExpr(InitListExpr *E) {
6054c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
606d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSyntacticForm(cast_or_null<InitListExpr>(Reader.ReadSubStmt()));
607c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLBraceLoc(ReadSourceLocation(Record, Idx));
608c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRBraceLoc(ReadSourceLocation(Record, Idx));
6092ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis  bool isArrayFiller = Record[Idx++];
6102ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis  Expr *filler = 0;
6112ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis  if (isArrayFiller) {
6122ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis    filler = Reader.ReadSubExpr();
6132ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis    E->ArrayFillerOrUnionFieldInit = filler;
6142ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis  } else
615409448c832d27703146b70a1137d86b020f29863Douglas Gregor    E->ArrayFillerOrUnionFieldInit = ReadDeclAs<FieldDecl>(Record, Idx);
6164c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->sawArrayRangeDesignator(Record[Idx++]);
6172ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis  unsigned NumInits = Record[Idx++];
618359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor  E->reserveInits(Reader.getContext(), NumInits);
6192ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis  if (isArrayFiller) {
6202ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis    for (unsigned I = 0; I != NumInits; ++I) {
6212ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis      Expr *init = Reader.ReadSubExpr();
622359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      E->updateInit(Reader.getContext(), I, init ? init : filler);
6232ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis    }
6242ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis  } else {
6252ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis    for (unsigned I = 0; I != NumInits; ++I)
626359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      E->updateInit(Reader.getContext(), I, Reader.ReadSubExpr());
6272ac0b7a2f10f64503b74f96a11993459805dd2f8Argyrios Kyrtzidis  }
6284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
6294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
63060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
6314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  typedef DesignatedInitExpr::Designator Designator;
6324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
6334c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
6344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned NumSubExprs = Record[Idx++];
6354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  assert(NumSubExprs == E->getNumSubExprs() && "Wrong number of subexprs");
6364c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0; I != NumSubExprs; ++I)
637d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setSubExpr(I, Reader.ReadSubExpr());
638c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setEqualOrColonLoc(ReadSourceLocation(Record, Idx));
6394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setGNUSyntax(Record[Idx++]);
6404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
6415f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<Designator, 4> Designators;
6424c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  while (Idx < Record.size()) {
6438538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    switch ((DesignatorTypes)Record[Idx++]) {
6448538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case DESIG_FIELD_DECL: {
645409448c832d27703146b70a1137d86b020f29863Douglas Gregor      FieldDecl *Field = ReadDeclAs<FieldDecl>(Record, Idx);
6461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      SourceLocation DotLoc
647c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        = ReadSourceLocation(Record, Idx);
6481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      SourceLocation FieldLoc
649c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        = ReadSourceLocation(Record, Idx);
6501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      Designators.push_back(Designator(Field->getIdentifier(), DotLoc,
6514c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner                                       FieldLoc));
6524c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      Designators.back().setField(Field);
6534c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
6544c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
6554c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
6568538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case DESIG_FIELD_NAME: {
65795eab176f51beed44a9bc14c0dcdd37844b23740Douglas Gregor      const IdentifierInfo *Name = Reader.GetIdentifierInfo(F, Record, Idx);
6581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      SourceLocation DotLoc
659c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        = ReadSourceLocation(Record, Idx);
6601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      SourceLocation FieldLoc
661c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        = ReadSourceLocation(Record, Idx);
6624c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      Designators.push_back(Designator(Name, DotLoc, FieldLoc));
6634c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
6644c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
6651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6668538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case DESIG_ARRAY: {
6674c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      unsigned Index = Record[Idx++];
6684c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      SourceLocation LBracketLoc
669c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        = ReadSourceLocation(Record, Idx);
6704c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      SourceLocation RBracketLoc
671c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        = ReadSourceLocation(Record, Idx);
6724c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      Designators.push_back(Designator(Index, LBracketLoc, RBracketLoc));
6734c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
6744c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
6754c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
6768538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case DESIG_ARRAY_RANGE: {
6774c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      unsigned Index = Record[Idx++];
6784c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      SourceLocation LBracketLoc
679c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        = ReadSourceLocation(Record, Idx);
6804c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      SourceLocation EllipsisLoc
681c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        = ReadSourceLocation(Record, Idx);
6824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      SourceLocation RBracketLoc
683c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        = ReadSourceLocation(Record, Idx);
6844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      Designators.push_back(Designator(Index, LBracketLoc, EllipsisLoc,
6854c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner                                       RBracketLoc));
6864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
6874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
6884c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
6894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
690359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor  E->setDesignators(Reader.getContext(),
691319d57f21600dd2c4d52ccc27bd12ce260b174e7Douglas Gregor                    Designators.data(), Designators.size());
6924c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
6934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
69460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
6954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
6964c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
6974c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
69860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitVAArgExpr(VAArgExpr *E) {
6994c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
700d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
701c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setWrittenTypeInfo(GetTypeSourceInfo(Record, Idx));
702c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setBuiltinLoc(ReadSourceLocation(Record, Idx));
703c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRParenLoc(ReadSourceLocation(Record, Idx));
7044c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7054c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
70660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitAddrLabelExpr(AddrLabelExpr *E) {
7074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
708c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setAmpAmpLoc(ReadSourceLocation(Record, Idx));
709c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLabelLoc(ReadSourceLocation(Record, Idx));
710409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->setLabel(ReadDeclAs<LabelDecl>(Record, Idx));
7114c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7124c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
71360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitStmtExpr(StmtExpr *E) {
7144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
715c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLParenLoc(ReadSourceLocation(Record, Idx));
716c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRParenLoc(ReadSourceLocation(Record, Idx));
717d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubStmt(cast_or_null<CompoundStmt>(Reader.ReadSubStmt()));
7184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7194c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
72060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitChooseExpr(ChooseExpr *E) {
7214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
722d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setCond(Reader.ReadSubExpr());
723d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setLHS(Reader.ReadSubExpr());
724d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setRHS(Reader.ReadSubExpr());
725c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setBuiltinLoc(ReadSourceLocation(Record, Idx));
726c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRParenLoc(ReadSourceLocation(Record, Idx));
7274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
72960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitGNUNullExpr(GNUNullExpr *E) {
7304c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
731c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setTokenLocation(ReadSourceLocation(Record, Idx));
7324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7334c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
73460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
7354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
7365f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<Expr *, 16> Exprs;
7374c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned NumExprs = Record[Idx++];
738919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  while (NumExprs--)
739d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    Exprs.push_back(Reader.ReadSubExpr());
740359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor  E->setExprs(Reader.getContext(), Exprs.data(), Exprs.size());
741c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setBuiltinLoc(ReadSourceLocation(Record, Idx));
742c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRParenLoc(ReadSourceLocation(Record, Idx));
7434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7444c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
74560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitBlockExpr(BlockExpr *E) {
7464c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
747409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->setBlockDecl(ReadDeclAs<BlockDecl>(Record, Idx));
7484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7494c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
75060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitBlockDeclRefExpr(BlockDeclRefExpr *E) {
7514c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
752409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->setDecl(ReadDeclAs<VarDecl>(Record, Idx));
753c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLocation(ReadSourceLocation(Record, Idx));
7544c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setByRef(Record[Idx++]);
7559b0b57c6f9996bfdb67248f6942dd23acfa36167Fariborz Jahanian  E->setConstQualAdded(Record[Idx++]);
7564c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
7574c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
758f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbournevoid ASTStmtReader::VisitGenericSelectionExpr(GenericSelectionExpr *E) {
759f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  VisitExpr(E);
760f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  E->NumAssocs = Record[Idx++];
761359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor  E->AssocTypes = new (Reader.getContext()) TypeSourceInfo*[E->NumAssocs];
762f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  E->SubExprs =
763359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor   new(Reader.getContext()) Stmt*[GenericSelectionExpr::END_EXPR+E->NumAssocs];
764f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
765f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  E->SubExprs[GenericSelectionExpr::CONTROLLING] = Reader.ReadSubExpr();
766f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  for (unsigned I = 0, N = E->getNumAssocs(); I != N; ++I) {
767f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    E->AssocTypes[I] = GetTypeSourceInfo(Record, Idx);
768f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    E->SubExprs[GenericSelectionExpr::END_EXPR+I] = Reader.ReadSubExpr();
769f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  }
770f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  E->ResultIndex = Record[Idx++];
771f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
772f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  E->GenericLoc = ReadSourceLocation(Record, Idx);
773f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  E->DefaultLoc = ReadSourceLocation(Record, Idx);
774f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  E->RParenLoc = ReadSourceLocation(Record, Idx);
775f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne}
776f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
777276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedmanvoid ASTStmtReader::VisitAtomicExpr(AtomicExpr *E) {
778276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  VisitExpr(E);
779276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  E->setOp(AtomicExpr::AtomicOp(Record[Idx++]));
780276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  E->setPtr(Reader.ReadSubExpr());
781276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  E->setOrder(Reader.ReadSubExpr());
782276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  E->setNumSubExprs(2);
783276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  if (E->getOp() != AtomicExpr::Load) {
784276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    E->setVal1(Reader.ReadSubExpr());
785276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    E->setNumSubExprs(3);
786276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  }
787276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  if (E->isCmpXChg()) {
788276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    E->setOrderFail(Reader.ReadSubExpr());
789276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    E->setVal2(Reader.ReadSubExpr());
790276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    E->setNumSubExprs(5);
791276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  }
792276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  E->setBuiltinLoc(ReadSourceLocation(Record, Idx));
793276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  E->setRParenLoc(ReadSourceLocation(Record, Idx));
794276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman}
795276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman
7964c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner//===----------------------------------------------------------------------===//
7974c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner// Objective-C Expressions and Statements
7984c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
79960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCStringLiteral(ObjCStringLiteral *E) {
8004c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
801d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setString(cast<StringLiteral>(Reader.ReadSubStmt()));
802c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setAtLoc(ReadSourceLocation(Record, Idx));
8034c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8044c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
80560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
8064c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
807c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setEncodedTypeSourceInfo(GetTypeSourceInfo(Record, Idx));
808c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setAtLoc(ReadSourceLocation(Record, Idx));
809c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRParenLoc(ReadSourceLocation(Record, Idx));
8104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8114c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
81260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
8134c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
8142d2689ab787c6d54cb985c28ff3f16370bc01b0fDouglas Gregor  E->setSelector(Reader.ReadSelector(F, Record, Idx));
815c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setAtLoc(ReadSourceLocation(Record, Idx));
816c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRParenLoc(ReadSourceLocation(Record, Idx));
8174c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
81960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
8204c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
821409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->setProtocol(ReadDeclAs<ObjCProtocolDecl>(Record, Idx));
822c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setAtLoc(ReadSourceLocation(Record, Idx));
823c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRParenLoc(ReadSourceLocation(Record, Idx));
8244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8254c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
82660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
8274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
828409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->setDecl(ReadDeclAs<ObjCIvarDecl>(Record, Idx));
829c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLocation(ReadSourceLocation(Record, Idx));
830d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setBase(Reader.ReadSubExpr());
8314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setIsArrow(Record[Idx++]);
8324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  E->setIsFreeIvar(Record[Idx++]);
8334c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
83560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
8364c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
83712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  bool Implicit = Record[Idx++] != 0;
83812f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  if (Implicit) {
839409448c832d27703146b70a1137d86b020f29863Douglas Gregor    ObjCMethodDecl *Getter = ReadDeclAs<ObjCMethodDecl>(Record, Idx);
840409448c832d27703146b70a1137d86b020f29863Douglas Gregor    ObjCMethodDecl *Setter = ReadDeclAs<ObjCMethodDecl>(Record, Idx);
84112f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    E->setImplicitProperty(Getter, Setter);
84212f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  } else {
843409448c832d27703146b70a1137d86b020f29863Douglas Gregor    E->setExplicitProperty(ReadDeclAs<ObjCPropertyDecl>(Record, Idx));
8448ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian  }
845c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLocation(ReadSourceLocation(Record, Idx));
84612f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  E->setReceiverLocation(ReadSourceLocation(Record, Idx));
84712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  switch (Record[Idx++]) {
84812f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  case 0:
84912f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    E->setBase(Reader.ReadSubExpr());
85012f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    break;
85112f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  case 1:
852393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    E->setSuperReceiver(Reader.readType(F, Record, Idx));
85312f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    break;
85412f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  case 2:
855409448c832d27703146b70a1137d86b020f29863Douglas Gregor    E->setClassReceiver(ReadDeclAs<ObjCInterfaceDecl>(Record, Idx));
85612f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    break;
85712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  }
8584c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
8594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
86060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCMessageExpr(ObjCMessageExpr *E) {
8614c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitExpr(E);
86204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  assert(Record[Idx] == E->getNumArgs());
86304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  ++Idx;
864207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis  unsigned NumStoredSelLocs = Record[Idx++];
865207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis  E->SelLocsKind = Record[Idx++];
866f85e193739c953358c865005855253af4f68a497John McCall  E->setDelegateInitCall(Record[Idx++]);
86704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  ObjCMessageExpr::ReceiverKind Kind
86804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    = static_cast<ObjCMessageExpr::ReceiverKind>(Record[Idx++]);
86904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  switch (Kind) {
87004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::Instance:
871d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setInstanceReceiver(Reader.ReadSubExpr());
87204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
87304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
87404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::Class:
875c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    E->setClassReceiver(GetTypeSourceInfo(Record, Idx));
87604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
87704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
87804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::SuperClass:
87904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::SuperInstance: {
880393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor    QualType T = Reader.readType(F, Record, Idx);
881c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    SourceLocation SuperLoc = ReadSourceLocation(Record, Idx);
88204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    E->setSuper(SuperLoc, T, Kind == ObjCMessageExpr::SuperInstance);
88304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
88404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  }
8854c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
8864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
88704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  assert(Kind == E->getReceiverKind());
88804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
88904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  if (Record[Idx++])
890409448c832d27703146b70a1137d86b020f29863Douglas Gregor    E->setMethodDecl(ReadDeclAs<ObjCMethodDecl>(Record, Idx));
89104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  else
8922d2689ab787c6d54cb985c28ff3f16370bc01b0fDouglas Gregor    E->setSelector(Reader.ReadSelector(F, Record, Idx));
89304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
894f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis  E->LBracLoc = ReadSourceLocation(Record, Idx);
895f40f0d5a382395e0301d7dcbeaa2b8e90b8973b1Argyrios Kyrtzidis  E->RBracLoc = ReadSourceLocation(Record, Idx);
89604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
8974c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
898d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setArg(I, Reader.ReadSubExpr());
899207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis
900207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis  SourceLocation *Locs = E->getStoredSelLocs();
901207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis  for (unsigned I = 0; I != NumStoredSelLocs; ++I)
902207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis    Locs[I] = ReadSourceLocation(Record, Idx);
9034c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
9044c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
90560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
9064c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
907d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setElement(Reader.ReadSubStmt());
908d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCollection(Reader.ReadSubExpr());
909d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setBody(Reader.ReadSubStmt());
910c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setForLoc(ReadSourceLocation(Record, Idx));
911c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setRParenLoc(ReadSourceLocation(Record, Idx));
9124c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
9134c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
91460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCAtCatchStmt(ObjCAtCatchStmt *S) {
9154c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
916d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setCatchBody(Reader.ReadSubStmt());
917409448c832d27703146b70a1137d86b020f29863Douglas Gregor  S->setCatchParamDecl(ReadDeclAs<VarDecl>(Record, Idx));
918c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setAtCatchLoc(ReadSourceLocation(Record, Idx));
919c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setRParenLoc(ReadSourceLocation(Record, Idx));
9204c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
9214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
92260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
9234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
924d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setFinallyBody(Reader.ReadSubStmt());
925c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setAtFinallyLoc(ReadSourceLocation(Record, Idx));
9264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
9274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
928f85e193739c953358c865005855253af4f68a497John McCallvoid ASTStmtReader::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *S) {
929f85e193739c953358c865005855253af4f68a497John McCall  VisitStmt(S);
930f85e193739c953358c865005855253af4f68a497John McCall  S->setSubStmt(Reader.ReadSubStmt());
931f85e193739c953358c865005855253af4f68a497John McCall  S->setAtLoc(ReadSourceLocation(Record, Idx));
932f85e193739c953358c865005855253af4f68a497John McCall}
933f85e193739c953358c865005855253af4f68a497John McCall
93460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCAtTryStmt(ObjCAtTryStmt *S) {
9354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
9368f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  assert(Record[Idx] == S->getNumCatchStmts());
9378f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  ++Idx;
9388f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  bool HasFinally = Record[Idx++];
939d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setTryBody(Reader.ReadSubStmt());
940919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I)
941d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    S->setCatchStmt(I, cast_or_null<ObjCAtCatchStmt>(Reader.ReadSubStmt()));
9428f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor
9438f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  if (HasFinally)
944d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    S->setFinallyStmt(Reader.ReadSubStmt());
945c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setAtTryLoc(ReadSourceLocation(Record, Idx));
9464c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
9474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
94860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S) {
9494c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
950d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setSynchExpr(Reader.ReadSubStmt());
951d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setSynchBody(Reader.ReadSubStmt());
952c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setAtSynchronizedLoc(ReadSourceLocation(Record, Idx));
9534c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
9544c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
95560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitObjCAtThrowStmt(ObjCAtThrowStmt *S) {
9564c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  VisitStmt(S);
957d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  S->setThrowExpr(Reader.ReadSubStmt());
958c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->setThrowLoc(ReadSourceLocation(Record, Idx));
9594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
9604c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
961ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
962ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis// C++ Expressions and Statements
9637cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
9647cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis
96560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXCatchStmt(CXXCatchStmt *S) {
9667cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  VisitStmt(S);
967c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->CatchLoc = ReadSourceLocation(Record, Idx);
968409448c832d27703146b70a1137d86b020f29863Douglas Gregor  S->ExceptionDecl = ReadDeclAs<VarDecl>(Record, Idx);
9697cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  S->HandlerBlock = Reader.ReadSubStmt();
9707cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis}
9717cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis
97260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXTryStmt(CXXTryStmt *S) {
9737cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  VisitStmt(S);
9747cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  assert(Record[Idx] == S->getNumHandlers() && "NumStmtFields is wrong ?");
9757cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  ++Idx;
976c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  S->TryLoc = ReadSourceLocation(Record, Idx);
9777cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  S->getStmts()[0] = Reader.ReadSubStmt();
9787cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis  for (unsigned i = 0, e = S->getNumHandlers(); i != e; ++i)
9797cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis    S->getStmts()[i + 1] = Reader.ReadSubStmt();
9807cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis}
981ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis
982ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smithvoid ASTStmtReader::VisitCXXForRangeStmt(CXXForRangeStmt *S) {
983ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  VisitStmt(S);
984ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  S->setForLoc(ReadSourceLocation(Record, Idx));
985ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  S->setColonLoc(ReadSourceLocation(Record, Idx));
986ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  S->setRParenLoc(ReadSourceLocation(Record, Idx));
987ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  S->setRangeStmt(Reader.ReadSubStmt());
988ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  S->setBeginEndStmt(Reader.ReadSubStmt());
989ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  S->setCond(Reader.ReadSubExpr());
990ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  S->setInc(Reader.ReadSubExpr());
991ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  S->setLoopVarStmt(Reader.ReadSubStmt());
992ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  S->setBody(Reader.ReadSubStmt());
993ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith}
994ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith
99560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
996919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  VisitCallExpr(E);
997ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis  E->setOperator((OverloadedOperatorKind)Record[Idx++]);
998ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis}
999ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis
100060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXConstructExpr(CXXConstructExpr *E) {
100139da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor  VisitExpr(E);
10026d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  E->NumArgs = Record[Idx++];
10036d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  if (E->NumArgs)
1004359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    E->Args = new (Reader.getContext()) Stmt*[E->NumArgs];
10055e1b7c2f419544a88537f7ff4e32ed744ba7b44eArgyrios Kyrtzidis  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
1006d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setArg(I, Reader.ReadSubExpr());
1007409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->setConstructor(ReadDeclAs<CXXConstructorDecl>(Record, Idx));
1008c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLocation(ReadSourceLocation(Record, Idx));
10097cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara  E->setElidable(Record[Idx++]);
10107cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara  E->setHadMultipleCandidates(Record[Idx++]);
101116006c901315fa12a108b4e571f187f4b676e426Douglas Gregor  E->setRequiresZeroInitialization(Record[Idx++]);
10123c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor  E->setConstructionKind((CXXConstructExpr::ConstructionKind)Record[Idx++]);
1013428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth  E->ParenRange = ReadSourceRange(Record, Idx);
101439da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor}
10154c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
101660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {
10176d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  VisitCXXConstructExpr(E);
1018c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->Type = GetTypeSourceInfo(Record, Idx);
10196d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis}
10206d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis
102160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
1022919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  VisitExplicitCastExpr(E);
10231d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor  SourceRange R = ReadSourceRange(Record, Idx);
10241d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor  E->Loc = R.getBegin();
10251d5d0b9df6d2a3df338bc3e63000536406e7666cDouglas Gregor  E->RParenLoc = R.getEnd();
1026ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
1027ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
102860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
1029ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig  return VisitCXXNamedCastExpr(E);
1030ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
1031ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
103260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
1033ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig  return VisitCXXNamedCastExpr(E);
1034ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
1035ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
103660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E) {
1037ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig  return VisitCXXNamedCastExpr(E);
1038ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
1039ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
104060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
1041ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig  return VisitCXXNamedCastExpr(E);
1042ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
1043ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
104460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E) {
1045919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  VisitExplicitCastExpr(E);
1046c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setTypeBeginLoc(ReadSourceLocation(Record, Idx));
1047c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRParenLoc(ReadSourceLocation(Record, Idx));
1048ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig}
1049ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
105060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
1051eb7f96141f754150a92433286fa385910a22f494Sam Weinig  VisitExpr(E);
1052eb7f96141f754150a92433286fa385910a22f494Sam Weinig  E->setValue(Record[Idx++]);
1053c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLocation(ReadSourceLocation(Record, Idx));
1054eb7f96141f754150a92433286fa385910a22f494Sam Weinig}
1055eb7f96141f754150a92433286fa385910a22f494Sam Weinig
105660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
1057eb7f96141f754150a92433286fa385910a22f494Sam Weinig  VisitExpr(E);
1058c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLocation(ReadSourceLocation(Record, Idx));
1059eb7f96141f754150a92433286fa385910a22f494Sam Weinig}
1060eb7f96141f754150a92433286fa385910a22f494Sam Weinig
106160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
106214ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner  VisitExpr(E);
1063c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setSourceRange(ReadSourceRange(Record, Idx));
106414ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner  if (E->isTypeOperand()) { // typeid(int)
1065577d4796d358c0e72ebaa023113505226ab51b4fSebastian Redl    E->setTypeOperandSourceInfo(
1066c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        GetTypeSourceInfo(Record, Idx));
1067919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    return;
106814ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner  }
106914ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner
107014ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner  // typeid(42+2)
1071d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setExprOperand(Reader.ReadSubExpr());
107214ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner}
107314ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner
107460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXThisExpr(CXXThisExpr *E) {
10752fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner  VisitExpr(E);
1076c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLocation(ReadSourceLocation(Record, Idx));
10772fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner  E->setImplicit(Record[Idx++]);
10782fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner}
10792fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner
108060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXThrowExpr(CXXThrowExpr *E) {
10812fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner  VisitExpr(E);
1082bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor  E->ThrowLoc = ReadSourceLocation(Record, Idx);
1083bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor  E->Op = Reader.ReadSubExpr();
1084bca01b46850f867b2f4137f25c882022b58f8471Douglas Gregor  E->IsThrownVariableInScope = Record[Idx++];
10852fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner}
108614ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner
108760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
1088030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner  VisitExpr(E);
10898a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis
1090df2265591f7ce284160a3853611c43bc37170458Douglas Gregor  assert((bool)Record[Idx] == E->Param.getInt() && "We messed up at creation ?");
10918a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis  ++Idx; // HasOtherExprStored and SubExpr was handled during creation.
1092409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->Param.setPointer(ReadDeclAs<ParmVarDecl>(Record, Idx));
1093c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->Loc = ReadSourceLocation(Record, Idx);
1094d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner}
1095d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner
109660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
1097d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner  VisitExpr(E);
1098409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->setTemporary(Reader.ReadCXXTemporary(F, Record, Idx));
1099d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
1100d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner}
1101d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner
110260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
11035921863d8f24084797863b5df37842113bac4352Chris Lattner  VisitExpr(E);
1104c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->TypeInfo = GetTypeSourceInfo(Record, Idx);
1105c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->RParenLoc = ReadSourceLocation(Record, Idx);
11065921863d8f24084797863b5df37842113bac4352Chris Lattner}
11075921863d8f24084797863b5df37842113bac4352Chris Lattner
110860adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXNewExpr(CXXNewExpr *E) {
11095921863d8f24084797863b5df37842113bac4352Chris Lattner  VisitExpr(E);
11106ec278d1a354517e20f13a877481453ee7940c78John McCall  E->GlobalNew = Record[Idx++];
11116ec278d1a354517e20f13a877481453ee7940c78John McCall  E->Initializer = Record[Idx++];
11126ec278d1a354517e20f13a877481453ee7940c78John McCall  E->UsualArrayDeleteWantsSize = Record[Idx++];
11135921863d8f24084797863b5df37842113bac4352Chris Lattner  bool isArray = Record[Idx++];
11147cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara  E->setHadMultipleCandidates(Record[Idx++]);
11155921863d8f24084797863b5df37842113bac4352Chris Lattner  unsigned NumPlacementArgs = Record[Idx++];
11165921863d8f24084797863b5df37842113bac4352Chris Lattner  unsigned NumCtorArgs = Record[Idx++];
1117409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->setOperatorNew(ReadDeclAs<FunctionDecl>(Record, Idx));
1118409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->setOperatorDelete(ReadDeclAs<FunctionDecl>(Record, Idx));
1119409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->setConstructor(ReadDeclAs<CXXConstructorDecl>(Record, Idx));
1120c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->AllocatedTypeInfo = GetTypeSourceInfo(Record, Idx);
11214bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor  SourceRange TypeIdParens;
1122c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TypeIdParens.setBegin(ReadSourceLocation(Record, Idx));
1123c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  TypeIdParens.setEnd(ReadSourceLocation(Record, Idx));
11244bd40318cbea15310a37343db46de96c4fcc15e6Douglas Gregor  E->TypeIdParens = TypeIdParens;
1125428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth  E->StartLoc = ReadSourceLocation(Record, Idx);
1126428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth  E->EndLoc = ReadSourceLocation(Record, Idx);
1127428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth  E->ConstructorLParen = ReadSourceLocation(Record, Idx);
1128428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth  E->ConstructorRParen = ReadSourceLocation(Record, Idx);
1129428edafa9eb80e01dd40aab31d4166a787a741e1Chandler Carruth
1130359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor  E->AllocateArgsArray(Reader.getContext(), isArray, NumPlacementArgs,
11315921863d8f24084797863b5df37842113bac4352Chris Lattner                       NumCtorArgs);
11325921863d8f24084797863b5df37842113bac4352Chris Lattner
11335921863d8f24084797863b5df37842113bac4352Chris Lattner  // Install all the subexpressions.
11345921863d8f24084797863b5df37842113bac4352Chris Lattner  for (CXXNewExpr::raw_arg_iterator I = E->raw_arg_begin(),e = E->raw_arg_end();
11355921863d8f24084797863b5df37842113bac4352Chris Lattner       I != e; ++I)
1136d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    *I = Reader.ReadSubStmt();
11375921863d8f24084797863b5df37842113bac4352Chris Lattner}
11385921863d8f24084797863b5df37842113bac4352Chris Lattner
113960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
114095fc98ce95d4faa4f1bb2783384150530404ea6fArgyrios Kyrtzidis  VisitExpr(E);
1141f1b8911d35bb2830a13267581d3cbde4b6b85db6Argyrios Kyrtzidis  E->GlobalDelete = Record[Idx++];
1142f1b8911d35bb2830a13267581d3cbde4b6b85db6Argyrios Kyrtzidis  E->ArrayForm = Record[Idx++];
11434076dacf1497fb95cb298b9d964fbdbdaf9bde6cArgyrios Kyrtzidis  E->ArrayFormAsWritten = Record[Idx++];
11446ec278d1a354517e20f13a877481453ee7940c78John McCall  E->UsualArrayDeleteWantsSize = Record[Idx++];
1145409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->OperatorDelete = ReadDeclAs<FunctionDecl>(Record, Idx);
1146f1b8911d35bb2830a13267581d3cbde4b6b85db6Argyrios Kyrtzidis  E->Argument = Reader.ReadSubExpr();
1147c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->Loc = ReadSourceLocation(Record, Idx);
114895fc98ce95d4faa4f1bb2783384150530404ea6fArgyrios Kyrtzidis}
1149d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner
115060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
1151de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  VisitExpr(E);
1152de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis
1153f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor  E->Base = Reader.ReadSubExpr();
1154f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor  E->IsArrow = Record[Idx++];
1155f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor  E->OperatorLoc = ReadSourceLocation(Record, Idx);
1156f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor  E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
1157f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor  E->ScopeType = GetTypeSourceInfo(Record, Idx);
1158f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor  E->ColonColonLoc = ReadSourceLocation(Record, Idx);
1159f3db29fff6a583ecda823cf909ab7737d8d30129Douglas Gregor  E->TildeLoc = ReadSourceLocation(Record, Idx);
1160de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis
116195eab176f51beed44a9bc14c0dcdd37844b23740Douglas Gregor  IdentifierInfo *II = Reader.GetIdentifierInfo(F, Record, Idx);
1162de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  if (II)
1163c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    E->setDestroyedType(II, ReadSourceLocation(Record, Idx));
1164de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis  else
1165c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    E->setDestroyedType(GetTypeSourceInfo(Record, Idx));
1166de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis}
1167de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis
11684765fa05b5652fcc4356371c2f481d0ea9a1b007John McCallvoid ASTStmtReader::VisitExprWithCleanups(ExprWithCleanups *E) {
1169d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner  VisitExpr(E);
1170d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner  unsigned NumTemps = Record[Idx++];
1171d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner  if (NumTemps) {
1172359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor    E->setNumTemporaries(Reader.getContext(), NumTemps);
1173d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner    for (unsigned i = 0; i != NumTemps; ++i)
1174409448c832d27703146b70a1137d86b020f29863Douglas Gregor      E->setTemporary(i, Reader.ReadCXXTemporary(F, Record, Idx));
1175d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner  }
1176d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  E->setSubExpr(Reader.ReadSubExpr());
1177030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner}
1178030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner
1179919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidisvoid
118060adf4acf40b72227740bf966fb87eebddff3f37Sebastian RedlASTStmtReader::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){
11818dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  VisitExpr(E);
11828dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
1183def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor  if (Record[Idx++])
1184096832c5ed5b9106fa177ebc148489760c3bc496John McCall    ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),
1185def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                     Record[Idx++]);
11868dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
11877c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor  E->Base = Reader.ReadSubExpr();
1188393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor  E->BaseType = Reader.readType(F, Record, Idx);
11897c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor  E->IsArrow = Record[Idx++];
11907c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor  E->OperatorLoc = ReadSourceLocation(Record, Idx);
11917c3179cf463c3b3b8c21dbb955f933ba50b74f28Douglas Gregor  E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
1192409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->FirstQualifierFoundInScope = ReadDeclAs<NamedDecl>(Record, Idx);
11934045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  ReadDeclarationNameInfo(E->MemberNameInfo, Record, Idx);
11948dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis}
11958dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
1196919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidisvoid
119760adf4acf40b72227740bf966fb87eebddff3f37Sebastian RedlASTStmtReader::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
119812dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis  VisitExpr(E);
119912dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis
1200def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor  if (Record[Idx++])
1201def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor    ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),
1202def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                     Record[Idx++]);
120300cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor
120400cf3cc2718671aa48e8da264a523b0058a8591eDouglas Gregor  E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
12054045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  ReadDeclarationNameInfo(E->NameInfo, Record, Idx);
120612dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis}
120712dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis
1208919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidisvoid
120960adf4acf40b72227740bf966fb87eebddff3f37Sebastian RedlASTStmtReader::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) {
12108dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  VisitExpr(E);
12118dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  assert(Record[Idx] == E->arg_size() && "Read wrong record during creation ?");
12128dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  ++Idx; // NumArgs;
12138dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  for (unsigned I = 0, N = E->arg_size(); I != N; ++I)
1214d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    E->setArg(I, Reader.ReadSubExpr());
1215c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->Type = GetTypeSourceInfo(Record, Idx);
1216c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setLParenLoc(ReadSourceLocation(Record, Idx));
1217c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->setRParenLoc(ReadSourceLocation(Record, Idx));
12188dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis}
12198dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
122060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitOverloadExpr(OverloadExpr *E) {
1221a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  VisitExpr(E);
1222a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
1223def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor  // Read the explicit template argument list, if available.
1224def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor  if (Record[Idx++])
1225919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(),
1226def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                     Record[Idx++]);
1227a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
1228a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  unsigned NumDecls = Record[Idx++];
1229a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  UnresolvedSet<8> Decls;
1230a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  for (unsigned i = 0; i != NumDecls; ++i) {
1231409448c832d27703146b70a1137d86b020f29863Douglas Gregor    NamedDecl *D = ReadDeclAs<NamedDecl>(Record, Idx);
1232a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis    AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
1233a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis    Decls.addDecl(D, AS);
1234a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis  }
1235359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor  E->initializeResults(Reader.getContext(), Decls.begin(), Decls.end());
1236a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
12374045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis  ReadDeclarationNameInfo(E->NameInfo, Record, Idx);
12384c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor  E->QualifierLoc = Reader.ReadNestedNameSpecifierLoc(F, Record, Idx);
1239a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis}
1240a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
124160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
1242919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  VisitOverloadExpr(E);
12434c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor  E->IsArrow = Record[Idx++];
12444c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor  E->HasUnresolvedUsing = Record[Idx++];
12454c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor  E->Base = Reader.ReadSubExpr();
1246393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor  E->BaseType = Reader.readType(F, Record, Idx);
12474c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor  E->OperatorLoc = ReadSourceLocation(Record, Idx);
1248a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis}
1249a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
125060adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {
1251919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  VisitOverloadExpr(E);
12524c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor  E->RequiresADL = Record[Idx++];
1253ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  if (E->RequiresADL)
1254ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith    E->StdIsAssociatedNamespace = Record[Idx++];
12554c9be89bb615ec07eb3ed507c8fa9d0baa8a5ad7Douglas Gregor  E->Overloaded = Record[Idx++];
1256409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->NamingClass = ReadDeclAs<CXXRecordDecl>(Record, Idx);
1257bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis}
1258bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis
125960adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redlvoid ASTStmtReader::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
12606d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  VisitExpr(E);
12616d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  E->UTT = (UnaryTypeTrait)Record[Idx++];
12620dfd848fa4c9664852ba8c929a8bd3fce93ddca2Sebastian Redl  E->Value = (bool)Record[Idx++];
1263c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  SourceRange Range = ReadSourceRange(Record, Idx);
12646d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  E->Loc = Range.getBegin();
12656d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis  E->RParen = Range.getEnd();
1266c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->QueriedType = GetTypeSourceInfo(Record, Idx);
12676d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis}
12686d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis
12696ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichetvoid ASTStmtReader::VisitBinaryTypeTraitExpr(BinaryTypeTraitExpr *E) {
12706ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  VisitExpr(E);
12716ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  E->BTT = (BinaryTypeTrait)Record[Idx++];
12726ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  E->Value = (bool)Record[Idx++];
12736ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  SourceRange Range = ReadSourceRange(Record, Idx);
12746ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  E->Loc = Range.getBegin();
12756ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  E->RParen = Range.getEnd();
12766ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  E->LhsType = GetTypeSourceInfo(Record, Idx);
12776ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  E->RhsType = GetTypeSourceInfo(Record, Idx);
12786ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet}
12796ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet
128021ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegleyvoid ASTStmtReader::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
128121ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  VisitExpr(E);
128221ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  E->ATT = (ArrayTypeTrait)Record[Idx++];
128321ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  E->Value = (unsigned int)Record[Idx++];
128421ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  SourceRange Range = ReadSourceRange(Record, Idx);
128521ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  E->Loc = Range.getBegin();
128621ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  E->RParen = Range.getEnd();
128721ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  E->QueriedType = GetTypeSourceInfo(Record, Idx);
128821ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley}
128921ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley
1290552622067dc45013d240f73952fece703f5e63bdJohn Wiegleyvoid ASTStmtReader::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {
1291552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  VisitExpr(E);
1292552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  E->ET = (ExpressionTrait)Record[Idx++];
1293552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  E->Value = (bool)Record[Idx++];
1294552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  SourceRange Range = ReadSourceRange(Record, Idx);
1295552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  E->QueriedExpression = Reader.ReadSubExpr();
1296552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  E->Loc = Range.getBegin();
1297552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  E->RParen = Range.getEnd();
1298552622067dc45013d240f73952fece703f5e63bdJohn Wiegley}
1299552622067dc45013d240f73952fece703f5e63bdJohn Wiegley
13006b219d082434394c1ac401390ec1d1967727815aSebastian Redlvoid ASTStmtReader::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
13016b219d082434394c1ac401390ec1d1967727815aSebastian Redl  VisitExpr(E);
13025221d8f2da008689f7ff9476e6522bb2b63ec1a3Sebastian Redl  E->Value = (bool)Record[Idx++];
1303c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  E->Range = ReadSourceRange(Record, Idx);
13045221d8f2da008689f7ff9476e6522bb2b63ec1a3Sebastian Redl  E->Operand = Reader.ReadSubExpr();
13056b219d082434394c1ac401390ec1d1967727815aSebastian Redl}
13066b219d082434394c1ac401390ec1d1967727815aSebastian Redl
1307be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregorvoid ASTStmtReader::VisitPackExpansionExpr(PackExpansionExpr *E) {
1308be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor  VisitExpr(E);
1309be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor  E->EllipsisLoc = ReadSourceLocation(Record, Idx);
131067fd1251aad51bb80d050b7fa5e506fef0ec8e02Douglas Gregor  E->NumExpansions = Record[Idx++];
1311be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor  E->Pattern = Reader.ReadSubExpr();
1312be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor}
1313be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor
1314ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregorvoid ASTStmtReader::VisitSizeOfPackExpr(SizeOfPackExpr *E) {
1315ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  VisitExpr(E);
1316ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  E->OperatorLoc = ReadSourceLocation(Record, Idx);
1317ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  E->PackLoc = ReadSourceLocation(Record, Idx);
1318ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  E->RParenLoc = ReadSourceLocation(Record, Idx);
1319ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor  E->Length = Record[Idx++];
1320409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->Pack = ReadDeclAs<NamedDecl>(Record, Idx);
1321ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor}
1322ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor
13237110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCallvoid ASTStmtReader::VisitSubstNonTypeTemplateParmExpr(
13247110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall                                              SubstNonTypeTemplateParmExpr *E) {
13257110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  VisitExpr(E);
1326409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->Param = ReadDeclAs<NonTypeTemplateParmDecl>(Record, Idx);
13277110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  E->NameLoc = ReadSourceLocation(Record, Idx);
13287110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  E->Replacement = Reader.ReadSubExpr();
13297110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall}
13307110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall
1331c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregorvoid ASTStmtReader::VisitSubstNonTypeTemplateParmPackExpr(
1332c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor                                          SubstNonTypeTemplateParmPackExpr *E) {
1333c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor  VisitExpr(E);
1334409448c832d27703146b70a1137d86b020f29863Douglas Gregor  E->Param = ReadDeclAs<NonTypeTemplateParmDecl>(Record, Idx);
1335c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor  TemplateArgument ArgPack = Reader.ReadTemplateArgument(F, Record, Idx);
1336c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor  if (ArgPack.getKind() != TemplateArgument::Pack)
1337c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor    return;
1338c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor
1339c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor  E->Arguments = ArgPack.pack_begin();
1340c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor  E->NumArguments = ArgPack.pack_size();
1341c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor  E->NameLoc = ReadSourceLocation(Record, Idx);
1342c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor}
1343c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor
134403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregorvoid ASTStmtReader::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {
134503e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor  VisitExpr(E);
134603e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor  E->Temporary = Reader.ReadSubExpr();
134703e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor}
134803e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor
13497cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCallvoid ASTStmtReader::VisitOpaqueValueExpr(OpaqueValueExpr *E) {
13507cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall  VisitExpr(E);
135156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  Idx++; // skip ID
1352b608b987718c6d841115464f79ab2d1820a63e17Douglas Gregor  E->Loc = ReadSourceLocation(Record, Idx);
13537cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall}
13547cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall
1355e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne//===----------------------------------------------------------------------===//
13567110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall// Microsoft Expressions and Statements
13577110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall//===----------------------------------------------------------------------===//
13587110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCallvoid ASTStmtReader::VisitCXXUuidofExpr(CXXUuidofExpr *E) {
13597110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  VisitExpr(E);
13607110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  E->setSourceRange(ReadSourceRange(Record, Idx));
13617110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  if (E->isTypeOperand()) { // __uuidof(ComType)
13627110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall    E->setTypeOperandSourceInfo(
13637110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall        GetTypeSourceInfo(Record, Idx));
13647110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall    return;
13657110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  }
13667110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall
13677110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  // __uuidof(expr)
13687110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  E->setExprOperand(Reader.ReadSubExpr());
13697110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall}
13707110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall
13717110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCallvoid ASTStmtReader::VisitSEHExceptStmt(SEHExceptStmt *S) {
13727110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  VisitStmt(S);
13737110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  S->Loc = ReadSourceLocation(Record, Idx);
13747110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  S->Children[SEHExceptStmt::FILTER_EXPR] = Reader.ReadSubStmt();
13757110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  S->Children[SEHExceptStmt::BLOCK] = Reader.ReadSubStmt();
13767110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall}
13777110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall
13787110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCallvoid ASTStmtReader::VisitSEHFinallyStmt(SEHFinallyStmt *S) {
13797110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  VisitStmt(S);
13807110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  S->Loc = ReadSourceLocation(Record, Idx);
13817110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  S->Block = Reader.ReadSubStmt();
13827110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall}
13837110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall
13847110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCallvoid ASTStmtReader::VisitSEHTryStmt(SEHTryStmt *S) {
13857110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  VisitStmt(S);
13867110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  S->IsCXXTry = Record[Idx++];
13877110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  S->TryLoc = ReadSourceLocation(Record, Idx);
13887110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  S->Children[SEHTryStmt::TRY] = Reader.ReadSubStmt();
13897110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  S->Children[SEHTryStmt::HANDLER] = Reader.ReadSubStmt();
13907110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall}
13917110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall
13927110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall//===----------------------------------------------------------------------===//
1393e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne// CUDA Expressions and Statements
1394e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne//===----------------------------------------------------------------------===//
1395e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne
1396e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbournevoid ASTStmtReader::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
1397e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  VisitCallExpr(E);
1398e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  E->setConfig(cast<CallExpr>(Reader.ReadSubExpr()));
1399e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne}
1400e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne
14017110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall//===----------------------------------------------------------------------===//
14027110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall// OpenCL Expressions and Statements.
14037110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall//===----------------------------------------------------------------------===//
14047110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCallvoid ASTStmtReader::VisitAsTypeExpr(AsTypeExpr *E) {
14057110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  VisitExpr(E);
14067110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  E->BuiltinLoc = ReadSourceLocation(Record, Idx);
14077110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  E->RParenLoc = ReadSourceLocation(Record, Idx);
14087110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall  E->SrcExpr = Reader.ReadSubExpr();
14097110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall}
14107110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall
14117110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall//===----------------------------------------------------------------------===//
14127110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall// ASTReader Implementation
14137110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall//===----------------------------------------------------------------------===//
14147110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall
141572a9ae18553bf8b6bdad84d2c54f73741a47e275Douglas GregorStmt *ASTReader::ReadStmt(Module &F) {
1416919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  switch (ReadingKind) {
1417919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  case Read_Decl:
1418919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  case Read_Type:
1419c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl    return ReadStmtFromStream(F);
1420919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  case Read_Stmt:
1421d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis    return ReadSubStmt();
1422919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  }
1423919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
1424919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  llvm_unreachable("ReadingKind not set ?");
1425919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  return 0;
1426919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis}
1427919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
142872a9ae18553bf8b6bdad84d2c54f73741a47e275Douglas GregorExpr *ASTReader::ReadExpr(Module &F) {
1429c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  return cast_or_null<Expr>(ReadStmt(F));
1430919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis}
1431030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner
1432c43b54cbc10654ed59de797898042e1a05265246Sebastian RedlExpr *ASTReader::ReadSubExpr() {
1433d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis  return cast_or_null<Expr>(ReadSubStmt());
1434d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis}
1435d98a2ab9275f896df49e42ea4e4b8871610e0f45Argyrios Kyrtzidis
143652e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner// Within the bitstream, expressions are stored in Reverse Polish
143752e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner// Notation, with each of the subexpressions preceding the
1438919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis// expression they are stored in. Subexpressions are stored from last to first.
1439919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis// To evaluate expressions, we continue reading expressions and placing them on
1440919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis// the stack, with expressions having operands removing those operands from the
144152e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner// stack. Evaluation terminates when we see a STMT_STOP record, and
144252e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner// the single remaining expression on the stack is our result.
144372a9ae18553bf8b6bdad84d2c54f73741a47e275Douglas GregorStmt *ASTReader::ReadStmtFromStream(Module &F) {
1444919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
1445919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  ReadingKindTracker ReadingKind(Read_Stmt, *this);
1446c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  llvm::BitstreamCursor &Cursor = F.DeclsCursor;
1447c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl
1448919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis#ifndef NDEBUG
1449919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  unsigned PrevNumStmts = StmtStack.size();
1450919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis#endif
1451919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
14524c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  RecordData Record;
14534c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  unsigned Idx;
1454c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl  ASTStmtReader Reader(*this, F, Cursor, Record, Idx);
14554c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  Stmt::EmptyShell Empty;
14564c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14574c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  while (true) {
145852e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner    unsigned Code = Cursor.ReadCode();
14594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    if (Code == llvm::bitc::END_BLOCK) {
146052e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner      if (Cursor.ReadBlockEnd()) {
14613c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl        Error("error at end of block in AST file");
14624c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        return 0;
14634c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      }
14644c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14654c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
14664c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14674c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    if (Code == llvm::bitc::ENTER_SUBBLOCK) {
14684c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      // No known subblocks, always skip them.
146952e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner      Cursor.ReadSubBlockID();
147052e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner      if (Cursor.SkipBlock()) {
14713c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl        Error("malformed block record in AST file");
14724c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner        return 0;
14734c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      }
14744c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      continue;
14754c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
14764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14774c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    if (Code == llvm::bitc::DEFINE_ABBREV) {
147852e97d1afc98cf4cf0a6cb8f43769dfd8acbab20Chris Lattner      Cursor.ReadAbbrevRecord();
14794c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      continue;
14804c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
14814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14824c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    Stmt *S = 0;
14834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    Idx = 0;
14844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    Record.clear();
14854c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    bool Finished = false;
14868538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    switch ((StmtCode)Cursor.ReadRecord(Code, Record)) {
14878538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_STOP:
14884c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      Finished = true;
14894c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14904c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14918538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_NULL_PTR:
14921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      S = 0;
14934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14944c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14958538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_NULL:
14964c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) NullStmt(Empty);
14974c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
14984c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
14998538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_COMPOUND:
15004c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) CompoundStmt(Empty);
15014c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15024c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15038538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_CASE:
15044c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) CaseStmt(Empty);
15054c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15064c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15078538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_DEFAULT:
15084c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) DefaultStmt(Empty);
15094c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15118538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_LABEL:
15124c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) LabelStmt(Empty);
15134c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15144c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15158538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_IF:
15164c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) IfStmt(Empty);
15174c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15198538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_SWITCH:
15204c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) SwitchStmt(Empty);
15214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15224c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15238538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_WHILE:
15244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) WhileStmt(Empty);
15254c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15278538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_DO:
15284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) DoStmt(Empty);
15294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15318538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_FOR:
15324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ForStmt(Empty);
15334c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15344c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15358538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_GOTO:
15364c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) GotoStmt(Empty);
15374c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15398538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_INDIRECT_GOTO:
15404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) IndirectGotoStmt(Empty);
15414c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15424c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15438538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_CONTINUE:
15444c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ContinueStmt(Empty);
15454c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15464c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15478538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_BREAK:
15484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) BreakStmt(Empty);
15494c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15504c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15518538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_RETURN:
15524c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ReturnStmt(Empty);
15534c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15544c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15558538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_DECL:
15564c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) DeclStmt(Empty);
15574c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15584c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15598538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_ASM:
15604c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) AsmStmt(Empty);
15614c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15624c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15638538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_PREDEFINED:
15644c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) PredefinedExpr(Empty);
15654c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15678538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_DECL_REF:
15683aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth      S = DeclRefExpr::CreateEmpty(
1569359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor        Context,
15703aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth        /*HasQualifier=*/Record[ASTStmtReader::NumExprFields],
15713aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth        /*HasFoundDecl=*/Record[ASTStmtReader::NumExprFields + 1],
15723aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth        /*HasExplicitTemplateArgs=*/Record[ASTStmtReader::NumExprFields + 2],
15733aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth        /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields + 2] ?
15747cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara          Record[ASTStmtReader::NumExprFields + 4] : 0);
15754c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15778538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_INTEGER_LITERAL:
1578359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      S = IntegerLiteral::Create(Context, Empty);
15794c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15818538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_FLOATING_LITERAL:
1582359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      S = FloatingLiteral::Create(Context, Empty);
15834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
15858538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_IMAGINARY_LITERAL:
15864c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ImaginaryLiteral(Empty);
15874c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15884c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15898538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_STRING_LITERAL:
1590359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      S = StringLiteral::CreateEmpty(Context,
159160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                     Record[ASTStmtReader::NumExprFields + 1]);
15924c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15948538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CHARACTER_LITERAL:
15954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) CharacterLiteral(Empty);
15964c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
15974c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
15988538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_PAREN:
15994c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ParenExpr(Empty);
16004c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16014c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
16028538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_PAREN_LIST:
160337bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis      S = new (Context) ParenListExpr(Empty);
160437bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis      break;
160537bdfe284ad365f753741d1d89c078c148b3f4afArgyrios Kyrtzidis
16068538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_UNARY_OPERATOR:
16074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) UnaryOperator(Empty);
16084c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16094c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
16108538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OFFSETOF:
1611359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      S = OffsetOfExpr::CreateEmpty(Context,
161260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                    Record[ASTStmtReader::NumExprFields],
161360adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                    Record[ASTStmtReader::NumExprFields + 1]);
16148ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      break;
16158ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
16168538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_SIZEOF_ALIGN_OF:
1617f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne      S = new (Context) UnaryExprOrTypeTraitExpr(Empty);
16184c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16194c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
16208538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_ARRAY_SUBSCRIPT:
16214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ArraySubscriptExpr(Empty);
16224c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
16248538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CALL:
1625359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      S = new (Context) CallExpr(Context, Stmt::CallExprClass, Empty);
16264c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
16288538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_MEMBER: {
1629663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      // We load everything here and fully initialize it at creation.
1630663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      // That way we can use MemberExpr::Create and don't have to duplicate its
1631663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      // logic with a MemberExpr::CreateEmpty.
1632663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
1633663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      assert(Idx == 0);
163440d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor      NestedNameSpecifierLoc QualifierLoc;
1635663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      if (Record[Idx++]) { // HasQualifier.
163640d96a69c0e1e8c10f92d450c305a7aae696ca9cDouglas Gregor        QualifierLoc = ReadNestedNameSpecifierLoc(F, Record, Idx);
1637663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      }
1638663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
1639663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      TemplateArgumentListInfo ArgInfo;
1640def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor      bool HasExplicitTemplateArgs = Record[Idx++];
1641def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor      if (HasExplicitTemplateArgs) {
1642def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor        unsigned NumTemplateArgs = Record[Idx++];
1643c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        ArgInfo.setLAngleLoc(ReadSourceLocation(F, Record, Idx));
1644c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl        ArgInfo.setRAngleLoc(ReadSourceLocation(F, Record, Idx));
1645663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis        for (unsigned i = 0; i != NumTemplateArgs; ++i)
1646c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl          ArgInfo.addArgument(ReadTemplateArgumentLoc(F, Record, Idx));
1647663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      }
16487cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara
16497cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara      bool HadMultipleCandidates = Record[Idx++];
16507cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara
1651409448c832d27703146b70a1137d86b020f29863Douglas Gregor      NamedDecl *FoundD = ReadDeclAs<NamedDecl>(F, Record, Idx);
1652663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      AccessSpecifier AS = (AccessSpecifier)Record[Idx++];
1653663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      DeclAccessPair FoundDecl = DeclAccessPair::make(FoundD, AS);
1654663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
1655393f249399fe30e9580e1529a7479489e90f3a57Douglas Gregor      QualType T = readType(F, Record, Idx);
1656f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      ExprValueKind VK = static_cast<ExprValueKind>(Record[Idx++]);
1657f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      ExprObjectKind OK = static_cast<ExprObjectKind>(Record[Idx++]);
1658663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      Expr *Base = ReadSubExpr();
1659409448c832d27703146b70a1137d86b020f29863Douglas Gregor      ValueDecl *MemberD = ReadDeclAs<ValueDecl>(F, Record, Idx);
1660c3632730cc83ed7b51f0ab5c38997ae5a9439b0cSebastian Redl      SourceLocation MemberLoc = ReadSourceLocation(F, Record, Idx);
16612577743c5650c646fb705df01403707e94f2df04Abramo Bagnara      DeclarationNameInfo MemberNameInfo(MemberD->getDeclName(), MemberLoc);
1662663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis      bool IsArrow = Record[Idx++];
1663663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis
1664359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      S = MemberExpr::Create(Context, Base, IsArrow, QualifierLoc,
16652577743c5650c646fb705df01403707e94f2df04Abramo Bagnara                             MemberD, FoundDecl, MemberNameInfo,
1666def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                             HasExplicitTemplateArgs ? &ArgInfo : 0, T, VK, OK);
16674045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis      ReadDeclarationNameLoc(F, cast<MemberExpr>(S)->MemberDNLoc,
16684045107b7384fd68eed5e3e2f06fc2a47e7be0a6Argyrios Kyrtzidis                             MemberD->getDeclName(), Record, Idx);
16697cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara      if (HadMultipleCandidates)
16707cc58b4c927fca539d43eaa58e00dca95946eb7cAbramo Bagnara        cast<MemberExpr>(S)->setHadMultipleCandidates(true);
16714c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
1672663e380d7b2de2bbf20e886e05371195bea9adc4Argyrios Kyrtzidis    }
16734c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
16748538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_BINARY_OPERATOR:
16754c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) BinaryOperator(Empty);
16764c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16774c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
16788538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_COMPOUND_ASSIGN_OPERATOR:
16794c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) CompoundAssignOperator(Empty);
16804c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16814c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
16828538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CONDITIONAL_OPERATOR:
16834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ConditionalOperator(Empty);
16844c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16854c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
168656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    case EXPR_BINARY_CONDITIONAL_OPERATOR:
168756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      S = new (Context) BinaryConditionalOperator(Empty);
168856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      break;
168956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
16908538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_IMPLICIT_CAST:
1691359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      S = ImplicitCastExpr::CreateEmpty(Context,
169260adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
16934c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16944c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
16958538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CSTYLE_CAST:
1696359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      S = CStyleCastExpr::CreateEmpty(Context,
169760adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
16984c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
16994c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
17008538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_COMPOUND_LITERAL:
17014c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) CompoundLiteralExpr(Empty);
17024c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17034c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
17048538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_EXT_VECTOR_ELEMENT:
17054c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ExtVectorElementExpr(Empty);
17064c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17074c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
17088538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_INIT_LIST:
1709359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      S = new (Context) InitListExpr(getContext(), Empty);
17104c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17114c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
17128538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_DESIGNATED_INIT:
1713359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      S = DesignatedInitExpr::CreateEmpty(Context,
171460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                     Record[ASTStmtReader::NumExprFields] - 1);
17151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17164c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17174c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
17188538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_IMPLICIT_VALUE_INIT:
17194c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ImplicitValueInitExpr(Empty);
17204c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17214c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
17228538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_VA_ARG:
17234c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) VAArgExpr(Empty);
17244c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17254c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
17268538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_ADDR_LABEL:
17274c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) AddrLabelExpr(Empty);
17284c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17294c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
17308538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_STMT:
17314c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) StmtExpr(Empty);
17324c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17334c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
17348538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CHOOSE:
17354c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ChooseExpr(Empty);
17364c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17374c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
17388538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_GNU_NULL:
17394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) GNUNullExpr(Empty);
17404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17414c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
17428538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_SHUFFLE_VECTOR:
17434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ShuffleVectorExpr(Empty);
17444c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17468538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_BLOCK:
17474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) BlockExpr(Empty);
17484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17494c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
17508538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_BLOCK_DECL_REF:
17514c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) BlockDeclRefExpr(Empty);
17524c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1754f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    case EXPR_GENERIC_SELECTION:
1755f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne      S = new (Context) GenericSelectionExpr(Empty);
1756f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne      break;
1757f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
17588538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_STRING_LITERAL:
17594c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCStringLiteral(Empty);
17604c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17618538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_ENCODE:
17624c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCEncodeExpr(Empty);
17634c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17648538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_SELECTOR_EXPR:
17654c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCSelectorExpr(Empty);
17664c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17678538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_PROTOCOL_EXPR:
17684c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCProtocolExpr(Empty);
17694c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17708538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_IVAR_REF_EXPR:
17714c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCIvarRefExpr(Empty);
17724c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17738538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_PROPERTY_REF_EXPR:
17744c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCPropertyRefExpr(Empty);
17754c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17768538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_KVC_REF_EXPR:
177712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall      llvm_unreachable("mismatching AST file");
17784c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17798538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_MESSAGE_EXPR:
1780359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      S = ObjCMessageExpr::CreateEmpty(Context,
1781207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis                                     Record[ASTStmtReader::NumExprFields],
1782207180802c836fda8acbedb47a92f9d2bdca59c3Argyrios Kyrtzidis                                     Record[ASTStmtReader::NumExprFields + 1]);
17834c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17848538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_OBJC_ISA:
1785f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff      S = new (Context) ObjCIsaExpr(Empty);
1786f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff      break;
1787f85e193739c953358c865005855253af4f68a497John McCall    case EXPR_OBJC_INDIRECT_COPY_RESTORE:
1788f85e193739c953358c865005855253af4f68a497John McCall      S = new (Context) ObjCIndirectCopyRestoreExpr(Empty);
1789f85e193739c953358c865005855253af4f68a497John McCall      break;
1790f85e193739c953358c865005855253af4f68a497John McCall    case EXPR_OBJC_BRIDGED_CAST:
1791f85e193739c953358c865005855253af4f68a497John McCall      S = new (Context) ObjCBridgedCastExpr(Empty);
1792f85e193739c953358c865005855253af4f68a497John McCall      break;
17938538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_FOR_COLLECTION:
17944c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCForCollectionStmt(Empty);
17954c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17968538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_CATCH:
17974c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCAtCatchStmt(Empty);
17984c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
17998538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_FINALLY:
18004c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCAtFinallyStmt(Empty);
18014c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
18028538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_AT_TRY:
1803359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      S = ObjCAtTryStmt::CreateEmpty(Context,
180460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                     Record[ASTStmtReader::NumStmtFields],
180560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                                     Record[ASTStmtReader::NumStmtFields + 1]);
18064c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
18078538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_AT_SYNCHRONIZED:
18084c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCAtSynchronizedStmt(Empty);
18094c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
18108538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_OBJC_AT_THROW:
18114c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      S = new (Context) ObjCAtThrowStmt(Empty);
18124c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
1813f85e193739c953358c865005855253af4f68a497John McCall    case STMT_OBJC_AUTORELEASE_POOL:
1814f85e193739c953358c865005855253af4f68a497John McCall      S = new (Context) ObjCAutoreleasePoolStmt(Empty);
1815f85e193739c953358c865005855253af4f68a497John McCall      break;
18167110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall    case STMT_SEH_EXCEPT:
18177110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall      S = new (Context) SEHExceptStmt(Empty);
18187110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall      break;
18197110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall    case STMT_SEH_FINALLY:
18207110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall      S = new (Context) SEHFinallyStmt(Empty);
18217110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall      break;
18227110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall    case STMT_SEH_TRY:
18237110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall      S = new (Context) SEHTryStmt(Empty);
18247110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall      break;
18258538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_CXX_CATCH:
18267cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis      S = new (Context) CXXCatchStmt(Empty);
18277cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis      break;
18287cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis
18298538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case STMT_CXX_TRY:
1830359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      S = CXXTryStmt::Create(Context, Empty,
183160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl             /*NumHandlers=*/Record[ASTStmtReader::NumStmtFields]);
18327cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis      break;
18337cb45e37b6f924d9ddbc53ac023bbaadb4ca3534Argyrios Kyrtzidis
1834ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith    case STMT_CXX_FOR_RANGE:
1835ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith      S = new (Context) CXXForRangeStmt(Empty);
1836ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith      break;
1837ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith
18388538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_OPERATOR_CALL:
1839359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      S = new (Context) CXXOperatorCallExpr(Context, Empty);
1840ba0a9006dbc4814e1e35f82812cb5a1dad65e8b8Argyrios Kyrtzidis      break;
18411817bd483b538fd3f4530649f5cb900bad9e8a76Chris Lattner
18428538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_MEMBER_CALL:
1843359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      S = new (Context) CXXMemberCallExpr(Context, Empty);
18441817bd483b538fd3f4530649f5cb900bad9e8a76Chris Lattner      break;
184539da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor
18468538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_CONSTRUCT:
18476d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis      S = new (Context) CXXConstructExpr(Empty);
18486d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis      break;
18496d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis
18508538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_TEMPORARY_OBJECT:
18516d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis      S = new (Context) CXXTemporaryObjectExpr(Empty);
185239da0b8145eaec7da7004f9b3645c5c9f4f63b1dDouglas Gregor      break;
1853ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
18548538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_STATIC_CAST:
1855359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      S = CXXStaticCastExpr::CreateEmpty(Context,
185660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1857ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig      break;
1858ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
18598538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_DYNAMIC_CAST:
1860359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      S = CXXDynamicCastExpr::CreateEmpty(Context,
186160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1862ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig      break;
1863ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
18648538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_REINTERPRET_CAST:
1865359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      S = CXXReinterpretCastExpr::CreateEmpty(Context,
186660adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1867ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig      break;
1868ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
18698538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_CONST_CAST:
1870359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      S = CXXConstCastExpr::CreateEmpty(Context);
1871ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig      break;
1872ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
18738538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_FUNCTIONAL_CAST:
1874359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      S = CXXFunctionalCastExpr::CreateEmpty(Context,
187560adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                       /*PathSize*/ Record[ASTStmtReader::NumExprFields]);
1876ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig      break;
1877ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
18788538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_BOOL_LITERAL:
1879eb7f96141f754150a92433286fa385910a22f494Sam Weinig      S = new (Context) CXXBoolLiteralExpr(Empty);
1880eb7f96141f754150a92433286fa385910a22f494Sam Weinig      break;
1881ce757a7a1ee905f87551996a69da3e95e8afeeb7Sam Weinig
18828538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_NULL_PTR_LITERAL:
1883eb7f96141f754150a92433286fa385910a22f494Sam Weinig      S = new (Context) CXXNullPtrLiteralExpr(Empty);
1884eb7f96141f754150a92433286fa385910a22f494Sam Weinig      break;
18858538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_TYPEID_EXPR:
188614ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner      S = new (Context) CXXTypeidExpr(Empty, true);
188714ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner      break;
18888538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_TYPEID_TYPE:
188914ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner      S = new (Context) CXXTypeidExpr(Empty, false);
189014ab24f01e36d495fce183aa67b41e45cdd54f39Chris Lattner      break;
189101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    case EXPR_CXX_UUIDOF_EXPR:
189201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet      S = new (Context) CXXUuidofExpr(Empty, true);
189301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet      break;
189401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    case EXPR_CXX_UUIDOF_TYPE:
189501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet      S = new (Context) CXXUuidofExpr(Empty, false);
189601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet      break;
18978538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_THIS:
18982fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner      S = new (Context) CXXThisExpr(Empty);
18992fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner      break;
19008538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_THROW:
19012fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner      S = new (Context) CXXThrowExpr(Empty);
19022fbdfcdf3bbf7b941853d38b123930755e837437Chris Lattner      break;
19038538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_DEFAULT_ARG: {
190460adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl      bool HasOtherExprStored = Record[ASTStmtReader::NumExprFields];
19058a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis      if (HasOtherExprStored) {
19068a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis        Expr *SubExpr = ReadSubExpr();
1907359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor        S = CXXDefaultArgExpr::Create(Context, SourceLocation(), 0, SubExpr);
19088a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis      } else
19098a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis        S = new (Context) CXXDefaultArgExpr(Empty);
1910030854b95f7bfd86aaa8afd9ae1aff9768a37e9aChris Lattner      break;
19118a50733034edd6a349b34e2b9f0c8d0a874846d3Argyrios Kyrtzidis    }
19128538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_BIND_TEMPORARY:
1913d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner      S = new (Context) CXXBindTemporaryExpr(Empty);
1914d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner      break;
1915e2ca6d4a2f41876930fbd304caa706452d2569d8Douglas Gregor
19168538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_SCALAR_VALUE_INIT:
1917ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregor      S = new (Context) CXXScalarValueInitExpr(Empty);
19185921863d8f24084797863b5df37842113bac4352Chris Lattner      break;
19198538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_NEW:
19205921863d8f24084797863b5df37842113bac4352Chris Lattner      S = new (Context) CXXNewExpr(Empty);
19215921863d8f24084797863b5df37842113bac4352Chris Lattner      break;
19228538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_DELETE:
192395fc98ce95d4faa4f1bb2783384150530404ea6fArgyrios Kyrtzidis      S = new (Context) CXXDeleteExpr(Empty);
192495fc98ce95d4faa4f1bb2783384150530404ea6fArgyrios Kyrtzidis      break;
19258538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_PSEUDO_DESTRUCTOR:
1926de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis      S = new (Context) CXXPseudoDestructorExpr(Empty);
1927de4bd18bb45a1db68996cfb949db3015fc25d10dArgyrios Kyrtzidis      break;
19285921863d8f24084797863b5df37842113bac4352Chris Lattner
19294765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall    case EXPR_EXPR_WITH_CLEANUPS:
19304765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall      S = new (Context) ExprWithCleanups(Empty);
1931d2598368876cfe40bc8465540033bc5b5e58d8afChris Lattner      break;
19328dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
19338538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_DEPENDENT_SCOPE_MEMBER:
1934359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      S = CXXDependentScopeMemberExpr::CreateEmpty(Context,
1935def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor          /*HasExplicitTemplateArgs=*/Record[ASTStmtReader::NumExprFields],
1936def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                  /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]
1937def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                   ? Record[ASTStmtReader::NumExprFields + 1]
1938def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                   : 0);
19398dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis      break;
19408dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis
19418538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_DEPENDENT_SCOPE_DECL_REF:
1942359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      S = DependentScopeDeclRefExpr::CreateEmpty(Context,
1943def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor          /*HasExplicitTemplateArgs=*/Record[ASTStmtReader::NumExprFields],
1944def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                  /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]
1945def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                   ? Record[ASTStmtReader::NumExprFields + 1]
1946def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                   : 0);
194712dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis      break;
194812dffcddb60380c5bed4f085a1f51534afda3b87Argyrios Kyrtzidis
19498538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_UNRESOLVED_CONSTRUCT:
1950359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      S = CXXUnresolvedConstructExpr::CreateEmpty(Context,
195160adf4acf40b72227740bf966fb87eebddff3f37Sebastian Redl                              /*NumArgs=*/Record[ASTStmtReader::NumExprFields]);
1952a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis      break;
1953a77eb0862507b900a10fa352af1568e639ed10b1Argyrios Kyrtzidis
19548538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_UNRESOLVED_MEMBER:
1955359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      S = UnresolvedMemberExpr::CreateEmpty(Context,
1956def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor          /*HasExplicitTemplateArgs=*/Record[ASTStmtReader::NumExprFields],
1957def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                  /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]
1958def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                   ? Record[ASTStmtReader::NumExprFields + 1]
1959def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                   : 0);
19608dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis      break;
1961bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis
19628538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_UNRESOLVED_LOOKUP:
1963359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      S = UnresolvedLookupExpr::CreateEmpty(Context,
1964def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor          /*HasExplicitTemplateArgs=*/Record[ASTStmtReader::NumExprFields],
1965def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                  /*NumTemplateArgs=*/Record[ASTStmtReader::NumExprFields]
1966def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                   ? Record[ASTStmtReader::NumExprFields + 1]
1967def0354384d9c4431f7b58b664b59896d4623028Douglas Gregor                                   : 0);
1968bd65bb511c26549c96b829c1282e4c877588564aArgyrios Kyrtzidis      break;
19696d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis
19708538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    case EXPR_CXX_UNARY_TYPE_TRAIT:
19716d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis      S = new (Context) UnaryTypeTraitExpr(Empty);
19726d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis      break;
19736b219d082434394c1ac401390ec1d1967727815aSebastian Redl
1974f187237d916afa97c491ac32fe98be7d335c5b63Francois Pichet    case EXPR_BINARY_TYPE_TRAIT:
19756ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet      S = new (Context) BinaryTypeTraitExpr(Empty);
19766ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet      break;
19776ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet
197821ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley    case EXPR_ARRAY_TYPE_TRAIT:
197921ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley      S = new (Context) ArrayTypeTraitExpr(Empty);
198021ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley      break;
198121ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley
1982552622067dc45013d240f73952fece703f5e63bdJohn Wiegley    case EXPR_CXX_EXPRESSION_TRAIT:
1983552622067dc45013d240f73952fece703f5e63bdJohn Wiegley      S = new (Context) ExpressionTraitExpr(Empty);
1984552622067dc45013d240f73952fece703f5e63bdJohn Wiegley      break;
1985552622067dc45013d240f73952fece703f5e63bdJohn Wiegley
19866b219d082434394c1ac401390ec1d1967727815aSebastian Redl    case EXPR_CXX_NOEXCEPT:
19876b219d082434394c1ac401390ec1d1967727815aSebastian Redl      S = new (Context) CXXNoexceptExpr(Empty);
19886b219d082434394c1ac401390ec1d1967727815aSebastian Redl      break;
19897cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall
1990be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor    case EXPR_PACK_EXPANSION:
1991be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor      S = new (Context) PackExpansionExpr(Empty);
1992be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor      break;
1993be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor
1994ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor    case EXPR_SIZEOF_PACK:
1995ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor      S = new (Context) SizeOfPackExpr(Empty);
1996ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor      break;
1997ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor
19987110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall    case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM:
19997110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall      S = new (Context) SubstNonTypeTemplateParmExpr(Empty);
20007110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall      break;
20017110fd6c32306b3feb97b9edb8064b1b68a54e6bJohn McCall
2002c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor    case EXPR_SUBST_NON_TYPE_TEMPLATE_PARM_PACK:
2003c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor      S = new (Context) SubstNonTypeTemplateParmPackExpr(Empty);
2004c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor      break;
2005c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor
200603e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor    case EXPR_MATERIALIZE_TEMPORARY:
200703e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor      S = new (Context) MaterializeTemporaryExpr(Empty);
200803e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor      break;
200903e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor
201056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    case EXPR_OPAQUE_VALUE: {
201156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      unsigned key = Record[ASTStmtReader::NumExprFields];
201256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      OpaqueValueExpr *&expr = OpaqueValueExprs[key];
201356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
201456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      // If we already have an entry for this opaque value expression,
201556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      // don't bother reading it again.
201656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      if (expr) {
201756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall        StmtStack.push_back(expr);
201856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall        continue;
201956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      }
202056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall
202156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall      S = expr = new (Context) OpaqueValueExpr(Empty);
20227cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall      break;
202356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall    }
2024e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne
2025e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne    case EXPR_CUDA_KERNEL_CALL:
2026359427794704666ff7a5a933ace11c5256fa3af7Douglas Gregor      S = new (Context) CUDAKernelCallExpr(Context, Empty);
2027e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne      break;
202861eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner
202961eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner    case EXPR_ASTYPE:
203061eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner      S = new (Context) AsTypeExpr(Empty);
203161eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner      break;
2032276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman
2033276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    case EXPR_ATOMIC:
2034276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman      S = new (Context) AtomicExpr(Empty);
2035276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman      break;
20364c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    }
20376d00c1365dd3601f6d93bbda9162913c57ae788fArgyrios Kyrtzidis
20384c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    // We hit a STMT_STOP, so we're done with this expression.
20394c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    if (Finished)
20404c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner      break;
20414c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
20424c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    ++NumStatementsRead;
20434c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
2044919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis    if (S)
2045919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis      Reader.Visit(S);
20464c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner
20474c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    assert(Idx == Record.size() && "Invalid deserialization of statement");
20484c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner    StmtStack.push_back(S);
20494c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner  }
2050919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
2051919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis#ifndef NDEBUG
2052919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  assert(StmtStack.size() > PrevNumStmts && "Read too many sub stmts!");
2053919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  assert(StmtStack.size() == PrevNumStmts + 1 && "Extra expressions on stack!");
2054919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis#endif
2055919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis
2056919e693e80632d214c1f3110f6ee5d1c0b61f06bArgyrios Kyrtzidis  return StmtStack.pop_back_val();
20574c6f952b70abd69e52fa567393c60295edb8a1a5Chris Lattner}
2058