summaryrefslogtreecommitdiffstats
path: root/clang/lib/Frontend/PCHReaderStmt.cpp
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2010-06-24 08:57:09 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2010-06-24 08:57:09 +0000
commit30d98f3d9ef6982986c9a4b12a5a6639769b9657 (patch)
tree49bc4ca510db0d06d36fa573e9c270f631988db6 /clang/lib/Frontend/PCHReaderStmt.cpp
parent80486625398ee66e025b20a2487ae218c193922e (diff)
downloadbcm5719-llvm-30d98f3d9ef6982986c9a4b12a5a6639769b9657.tar.gz
bcm5719-llvm-30d98f3d9ef6982986c9a4b12a5a6639769b9657.zip
Fix broken de/serialization for a couple of C++ Exprs.
llvm-svn: 106726
Diffstat (limited to 'clang/lib/Frontend/PCHReaderStmt.cpp')
-rw-r--r--clang/lib/Frontend/PCHReaderStmt.cpp11
1 files changed, 7 insertions, 4 deletions
diff --git a/clang/lib/Frontend/PCHReaderStmt.cpp b/clang/lib/Frontend/PCHReaderStmt.cpp
index 4a38a36367b..652fdb1cf23 100644
--- a/clang/lib/Frontend/PCHReaderStmt.cpp
+++ b/clang/lib/Frontend/PCHReaderStmt.cpp
@@ -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:
OpenPOWER on IntegriCloud