]> granicus.if.org Git - clang/commitdiff
Fix broken de/serialization for a couple of C++ Exprs.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 24 Jun 2010 08:57:09 +0000 (08:57 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 24 Jun 2010 08:57:09 +0000 (08:57 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@106726 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Frontend/PCHReaderStmt.cpp
lib/Frontend/PCHWriterStmt.cpp
test/PCH/cxx_exprs.cpp

index 4a38a36367bd372c175fd20d71b036ebc326c0da..652fdb1cf2327b59aa69fa9d02fb080c22dbf213 100644 (file)
@@ -957,12 +957,15 @@ unsigned PCHStmtReader::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
 
 unsigned PCHStmtReader::VisitCXXConstructExpr(CXXConstructExpr *E) {
   VisitExpr(E);
+  assert(Record[Idx] == E->getNumArgs() &&
+         "Read wrong record during creation ?");
+  ++Idx; // NumArgs;
+  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
+    E->setArg(I, cast<Expr>(StmtStack[StmtStack.size() - N + I]));
   E->setConstructor(cast<CXXConstructorDecl>(Reader.GetDecl(Record[Idx++])));
   E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
   E->setElidable(Record[Idx++]);  
   E->setRequiresZeroInitialization(Record[Idx++]);
-  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
-    E->setArg(I, cast<Expr>(StmtStack[StmtStack.size() - N + I]));
   E->setConstructionKind((CXXConstructExpr::ConstructionKind)Record[Idx++]);
   return E->getNumArgs();
 }
@@ -1032,7 +1035,7 @@ unsigned PCHStmtReader::VisitCXXThisExpr(CXXThisExpr *E) {
 unsigned PCHStmtReader::VisitCXXThrowExpr(CXXThrowExpr *E) {
   VisitExpr(E);
   E->setThrowLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
-  E->setSubExpr(cast<Expr>(StmtStack.back()));
+  E->setSubExpr(cast_or_null<Expr>(StmtStack.back()));
   return 1;
 }
 
@@ -1431,7 +1434,7 @@ Stmt *PCHReader::ReadStmt(llvm::BitstreamCursor &Cursor) {
         
     case pch::EXPR_CXX_CONSTRUCT:
       S = new (Context) CXXConstructExpr(Empty, *Context,
-                                      Record[PCHStmtReader::NumExprFields + 2]);
+                                      Record[PCHStmtReader::NumExprFields]);
       break;
 
     case pch::EXPR_CXX_STATIC_CAST:
index eb95eba58443bd1ed667d5a34d7edeae3ad8716d..80ee6a2ff89cfc5a4c10afa3a0aab28e701a0cb4 100644 (file)
@@ -869,13 +869,13 @@ void PCHStmtWriter::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
 
 void PCHStmtWriter::VisitCXXConstructExpr(CXXConstructExpr *E) {
   VisitExpr(E);
+  Record.push_back(E->getNumArgs());
+  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
+    Writer.WriteSubStmt(E->getArg(I));
   Writer.AddDeclRef(E->getConstructor(), Record);
   Writer.AddSourceLocation(E->getLocation(), Record);
   Record.push_back(E->isElidable());
   Record.push_back(E->requiresZeroInitialization());
-  Record.push_back(E->getNumArgs());
-  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I)
-    Writer.WriteSubStmt(E->getArg(I));
   Record.push_back(E->getConstructionKind()); // FIXME: stable encoding
   Code = pch::EXPR_CXX_CONSTRUCT;
 }
index ec7041b9843a6f02027674422e5b533deaa29561..2b9a5abbf11a940baeca6f59113ec5dc4de7d2c3 100644 (file)
@@ -1,9 +1,9 @@
 // Test this without pch.
-// RUN: %clang_cc1 -include %S/cxx_exprs.h -std=c++0x -fsyntax-only -verify %s
+// RUN: %clang_cc1 -include %S/cxx_exprs.h -std=c++0x -fsyntax-only -verify %s -ast-dump
 
-// Test with pch.
+// Test with pch. Use '-ast-dump' to force deserialization of function bodies.
 // RUN: %clang_cc1 -x c++-header -std=c++0x -emit-pch -o %t %S/cxx_exprs.h
-// RUN: %clang_cc1 -std=c++0x -include-pch %t -fsyntax-only -verify %s 
+// RUN: %clang_cc1 -std=c++0x -include-pch %t -fsyntax-only -verify %s -ast-dump
 
 int integer;
 double floating;
@@ -36,4 +36,4 @@ cxx_null_ptr_result null_ptr = nullptr;
 
 // CXXTypeidExpr
 typeid_result1 typeid_1 = 0;
-typeid_result2 typeid_2 = 0;
\ No newline at end of file
+typeid_result2 typeid_2 = 0;