]> granicus.if.org Git - clang/commitdiff
Support ParenListExpr for PCH.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Wed, 30 Jun 2010 08:49:18 +0000 (08:49 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Wed, 30 Jun 2010 08:49:18 +0000 (08:49 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@107266 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/Expr.h
include/clang/Frontend/PCHBitCodes.h
lib/Frontend/PCHReaderStmt.cpp
lib/Frontend/PCHWriterStmt.cpp

index 77c969e7450eff756298aeefb29d6bd207d19935..cb822e716ce8a192630cd2166ef8a3d3c21daf7d 100644 (file)
@@ -3241,7 +3241,7 @@ public:
   ~ParenListExpr() {}
 
   /// \brief Build an empty paren list.
-  //explicit ParenListExpr(EmptyShell Empty) : Expr(ParenListExprClass, Empty) { }
+  explicit ParenListExpr(EmptyShell Empty) : Expr(ParenListExprClass, Empty) { }
 
   unsigned getNumExprs() const { return NumExprs; }
 
@@ -3271,6 +3271,9 @@ public:
   // Iterators
   virtual child_iterator child_begin();
   virtual child_iterator child_end();
+
+  friend class PCHStmtReader;
+  friend class PCHStmtWriter;
 };
 
 
index 1635d4c83aa41dc1a49a8c29b4456b040b9559ff..fec40c825daa317dfc3e051606fd33c035f6c437 100644 (file)
@@ -650,6 +650,8 @@ namespace clang {
       EXPR_CHARACTER_LITERAL,
       /// \brief A ParenExpr record.
       EXPR_PAREN,
+      /// \brief A ParenListExpr record.
+      EXPR_PAREN_LIST,
       /// \brief A UnaryOperator record.
       EXPR_UNARY_OPERATOR,
       /// \brief An OffsetOfExpr record.
index 9a29234d5a8543e325996483e0fe67799cf74067..b9751e8496050b08c8cd06e68960a32bfcee1c4f 100644 (file)
@@ -17,7 +17,7 @@
 #include "clang/AST/StmtVisitor.h"
 using namespace clang;
 
-namespace {
+namespace clang {
 
   class PCHStmtReader : public StmtVisitor<PCHStmtReader> {
     PCHReader &Reader;
@@ -69,6 +69,7 @@ namespace {
     void VisitStringLiteral(StringLiteral *E);
     void VisitCharacterLiteral(CharacterLiteral *E);
     void VisitParenExpr(ParenExpr *E);
+    void VisitParenListExpr(ParenListExpr *E);
     void VisitUnaryOperator(UnaryOperator *E);
     void VisitOffsetOfExpr(OffsetOfExpr *E);
     void VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E);
@@ -429,6 +430,17 @@ void PCHStmtReader::VisitParenExpr(ParenExpr *E) {
   E->setSubExpr(Reader.ReadSubExpr());
 }
 
+void PCHStmtReader::VisitParenListExpr(ParenListExpr *E) {
+  VisitExpr(E);
+  unsigned NumExprs = Record[Idx++];
+  E->Exprs = new (*Reader.getContext()) Stmt*[NumExprs];
+  for (unsigned i = 0; i != NumExprs; ++i)
+    E->Exprs[i] = Reader.ReadSubStmt();
+  E->NumExprs = NumExprs;
+  E->LParenLoc = Reader.ReadSourceLocation(Record, Idx);
+  E->RParenLoc = Reader.ReadSourceLocation(Record, Idx);
+}
+
 void PCHStmtReader::VisitUnaryOperator(UnaryOperator *E) {
   VisitExpr(E);
   E->setSubExpr(Reader.ReadSubExpr());
@@ -1328,6 +1340,10 @@ Stmt *PCHReader::ReadStmtFromStream(llvm::BitstreamCursor &Cursor) {
       S = new (Context) ParenExpr(Empty);
       break;
 
+    case pch::EXPR_PAREN_LIST:
+      S = new (Context) ParenListExpr(Empty);
+      break;
+
     case pch::EXPR_UNARY_OPERATOR:
       S = new (Context) UnaryOperator(Empty);
       break;
index 5b45cb473f5309d9aa16997585a10bb924455668..11b1afd373088f19851e9f1dfb9de0c37faf8aa0 100644 (file)
@@ -22,7 +22,7 @@ using namespace clang;
 // Statement/expression serialization
 //===----------------------------------------------------------------------===//
 
-namespace {
+namespace clang {
   class PCHStmtWriter : public StmtVisitor<PCHStmtWriter, void> {
     PCHWriter &Writer;
     PCHWriter::RecordData &Record;
@@ -64,6 +64,7 @@ namespace {
     void VisitStringLiteral(StringLiteral *E);
     void VisitCharacterLiteral(CharacterLiteral *E);
     void VisitParenExpr(ParenExpr *E);
+    void VisitParenListExpr(ParenListExpr *E);
     void VisitUnaryOperator(UnaryOperator *E);
     void VisitOffsetOfExpr(OffsetOfExpr *E);
     void VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E);
@@ -418,6 +419,16 @@ void PCHStmtWriter::VisitParenExpr(ParenExpr *E) {
   Code = pch::EXPR_PAREN;
 }
 
+void PCHStmtWriter::VisitParenListExpr(ParenListExpr *E) {
+  VisitExpr(E);
+  Record.push_back(E->NumExprs);
+  for (unsigned i=0; i != E->NumExprs; ++i)
+    Writer.AddStmt(E->Exprs[i]);
+  Writer.AddSourceLocation(E->LParenLoc, Record);
+  Writer.AddSourceLocation(E->RParenLoc, Record);
+  Code = pch::EXPR_PAREN_LIST;
+}
+
 void PCHStmtWriter::VisitUnaryOperator(UnaryOperator *E) {
   VisitExpr(E);
   Writer.AddStmt(E->getSubExpr());