diff options
| -rw-r--r-- | clang/include/clang/AST/Expr.h | 5 | ||||
| -rw-r--r-- | clang/include/clang/Frontend/PCHBitCodes.h | 2 | ||||
| -rw-r--r-- | clang/lib/Frontend/PCHReaderStmt.cpp | 18 | ||||
| -rw-r--r-- | clang/lib/Frontend/PCHWriterStmt.cpp | 13 | 
4 files changed, 35 insertions, 3 deletions
diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h index 77c969e7450..cb822e716ce 100644 --- a/clang/include/clang/AST/Expr.h +++ b/clang/include/clang/AST/Expr.h @@ -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;  }; diff --git a/clang/include/clang/Frontend/PCHBitCodes.h b/clang/include/clang/Frontend/PCHBitCodes.h index 1635d4c83aa..fec40c825da 100644 --- a/clang/include/clang/Frontend/PCHBitCodes.h +++ b/clang/include/clang/Frontend/PCHBitCodes.h @@ -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. diff --git a/clang/lib/Frontend/PCHReaderStmt.cpp b/clang/lib/Frontend/PCHReaderStmt.cpp index 9a29234d5a8..b9751e84960 100644 --- a/clang/lib/Frontend/PCHReaderStmt.cpp +++ b/clang/lib/Frontend/PCHReaderStmt.cpp @@ -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; diff --git a/clang/lib/Frontend/PCHWriterStmt.cpp b/clang/lib/Frontend/PCHWriterStmt.cpp index 5b45cb473f5..11b1afd3730 100644 --- a/clang/lib/Frontend/PCHWriterStmt.cpp +++ b/clang/lib/Frontend/PCHWriterStmt.cpp @@ -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());  | 

