]> granicus.if.org Git - clang/commitdiff
Read/write CXXDeleteExpr from/to PCH.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Tue, 22 Jun 2010 17:07:59 +0000 (17:07 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Tue, 22 Jun 2010 17:07:59 +0000 (17:07 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@106552 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/ExprCXX.h
include/clang/Frontend/PCHBitCodes.h
lib/Frontend/PCHReaderStmt.cpp
lib/Frontend/PCHWriterStmt.cpp
test/PCH/cxx_exprs.h

index 0c493f36df09952b20bbe226344776e23a32c053..c7f4ff6288d40df738ec63a8ffa9e5abeac768ed 100644 (file)
@@ -1082,18 +1082,26 @@ public:
     : Expr(CXXDeleteExprClass, ty, false, false), GlobalDelete(globalDelete),
       ArrayForm(arrayForm), OperatorDelete(operatorDelete), Argument(arg),
       Loc(loc) { }
+  explicit CXXDeleteExpr(EmptyShell Shell)
+    : Expr(CXXDeleteExprClass, Shell), OperatorDelete(0), Argument(0) { }
 
   bool isGlobalDelete() const { return GlobalDelete; }
   bool isArrayForm() const { return ArrayForm; }
+  
+  void setGlobalDelete(bool V) { GlobalDelete = V; }
+  void setArrayForm(bool V) { ArrayForm = V; }
 
   FunctionDecl *getOperatorDelete() const { return OperatorDelete; }
+  void setOperatorDelete(FunctionDecl *D) { OperatorDelete = D; }
 
   Expr *getArgument() { return cast<Expr>(Argument); }
   const Expr *getArgument() const { return cast<Expr>(Argument); }
+  void setArgument(Expr *E) { Argument = E; }
 
   virtual SourceRange getSourceRange() const {
     return SourceRange(Loc, Argument->getLocEnd());
   }
+  void setStartLoc(SourceLocation L) { Loc = L; } 
 
   static bool classof(const Stmt *T) {
     return T->getStmtClass() == CXXDeleteExprClass;
index 4e1320188a1e1d63ec59b79934bc78b57a0120d4..b95d0d99ae39e69a698496bf531129303046045b 100644 (file)
@@ -763,6 +763,7 @@ namespace clang {
       //
       EXPR_CXX_ZERO_INIT_VALUE,   // CXXZeroInitValueExpr
       EXPR_CXX_NEW,               // CXXNewExpr
+      EXPR_CXX_DELETE,            // CXXDeleteExpr
       
       EXPR_CXX_EXPR_WITH_TEMPORARIES // CXXExprWithTemporaries
     };
index fd3cde43fa1292b2b32938664b9b81142bfeb3ee..4a38a36367bd372c175fd20d71b036ebc326c0da 100644 (file)
@@ -134,6 +134,7 @@ namespace {
     
     unsigned VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E);
     unsigned VisitCXXNewExpr(CXXNewExpr *E);
+    unsigned VisitCXXDeleteExpr(CXXDeleteExpr *E);
     
     unsigned VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E);
   };
@@ -1087,6 +1088,16 @@ unsigned PCHStmtReader::VisitCXXNewExpr(CXXNewExpr *E) {
   return TotalSubExprs;
 }
 
+unsigned PCHStmtReader::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
+  VisitExpr(E);
+  E->setGlobalDelete(Record[Idx++]);
+  E->setArrayForm(Record[Idx++]);
+  E->setOperatorDelete(
+                     cast_or_null<FunctionDecl>(Reader.GetDecl(Record[Idx++])));
+  E->setArgument(cast_or_null<Expr>(StmtStack.back()));
+  E->setStartLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
+  return 1;
+}
 
 unsigned PCHStmtReader::VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E) {
   VisitExpr(E);
@@ -1475,6 +1486,9 @@ Stmt *PCHReader::ReadStmt(llvm::BitstreamCursor &Cursor) {
     case pch::EXPR_CXX_NEW:
       S = new (Context) CXXNewExpr(Empty);
       break;
+    case pch::EXPR_CXX_DELETE:
+      S = new (Context) CXXDeleteExpr(Empty);
+      break;
         
         
     case pch::EXPR_CXX_EXPR_WITH_TEMPORARIES:
index b3501d0984456d95d2a28f5b740dffe126ba1291..eb95eba58443bd1ed667d5a34d7edeae3ad8716d 100644 (file)
@@ -130,6 +130,7 @@ namespace {
     
     void VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E);
     void VisitCXXNewExpr(CXXNewExpr *E);
+    void VisitCXXDeleteExpr(CXXDeleteExpr *E);
     
     void VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E);
   };
@@ -997,6 +998,16 @@ void PCHStmtWriter::VisitCXXNewExpr(CXXNewExpr *E) {
   Code = pch::EXPR_CXX_NEW;
 }
 
+void PCHStmtWriter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
+  VisitExpr(E);
+  Record.push_back(E->isGlobalDelete());
+  Record.push_back(E->isArrayForm());
+  Writer.AddDeclRef(E->getOperatorDelete(), Record);
+  Writer.WriteSubStmt(E->getArgument());
+  Writer.AddSourceLocation(E->getSourceRange().getBegin(), Record);
+  
+  Code = pch::EXPR_CXX_DELETE;
+}
 
 void PCHStmtWriter::VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E) {
   VisitExpr(E);
index f64792238991213d20d257732e335a1527d90f44..67ab4a6d34db9397d9133de22d9f3cb5afda11a6 100644 (file)
@@ -68,8 +68,8 @@ void Derived::g() {
   int A = int(0.5);  // CXXFunctionalCastExpr
   A = int();         // CXXZeroInitValueExpr
   
-  new Base(4);       // CXXNewExpr
-  
+  Base *b = new Base(4);       // CXXNewExpr
+  delete b;                    // CXXDeleteExpr
 }