forked from OSchip/llvm-project
Fix broken de/serialization for a couple of C++ Exprs.
llvm-svn: 106726
This commit is contained in:
parent
8048662539
commit
30d98f3d9e
|
@ -957,12 +957,15 @@ unsigned PCHStmtReader::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
|
||||||
|
|
||||||
unsigned PCHStmtReader::VisitCXXConstructExpr(CXXConstructExpr *E) {
|
unsigned PCHStmtReader::VisitCXXConstructExpr(CXXConstructExpr *E) {
|
||||||
VisitExpr(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->setConstructor(cast<CXXConstructorDecl>(Reader.GetDecl(Record[Idx++])));
|
||||||
E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
|
E->setLocation(SourceLocation::getFromRawEncoding(Record[Idx++]));
|
||||||
E->setElidable(Record[Idx++]);
|
E->setElidable(Record[Idx++]);
|
||||||
E->setRequiresZeroInitialization(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++]);
|
E->setConstructionKind((CXXConstructExpr::ConstructionKind)Record[Idx++]);
|
||||||
return E->getNumArgs();
|
return E->getNumArgs();
|
||||||
}
|
}
|
||||||
|
@ -1032,7 +1035,7 @@ unsigned PCHStmtReader::VisitCXXThisExpr(CXXThisExpr *E) {
|
||||||
unsigned PCHStmtReader::VisitCXXThrowExpr(CXXThrowExpr *E) {
|
unsigned PCHStmtReader::VisitCXXThrowExpr(CXXThrowExpr *E) {
|
||||||
VisitExpr(E);
|
VisitExpr(E);
|
||||||
E->setThrowLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
|
E->setThrowLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
|
||||||
E->setSubExpr(cast<Expr>(StmtStack.back()));
|
E->setSubExpr(cast_or_null<Expr>(StmtStack.back()));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1431,7 +1434,7 @@ Stmt *PCHReader::ReadStmt(llvm::BitstreamCursor &Cursor) {
|
||||||
|
|
||||||
case pch::EXPR_CXX_CONSTRUCT:
|
case pch::EXPR_CXX_CONSTRUCT:
|
||||||
S = new (Context) CXXConstructExpr(Empty, *Context,
|
S = new (Context) CXXConstructExpr(Empty, *Context,
|
||||||
Record[PCHStmtReader::NumExprFields + 2]);
|
Record[PCHStmtReader::NumExprFields]);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case pch::EXPR_CXX_STATIC_CAST:
|
case pch::EXPR_CXX_STATIC_CAST:
|
||||||
|
|
|
@ -869,13 +869,13 @@ void PCHStmtWriter::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
|
||||||
|
|
||||||
void PCHStmtWriter::VisitCXXConstructExpr(CXXConstructExpr *E) {
|
void PCHStmtWriter::VisitCXXConstructExpr(CXXConstructExpr *E) {
|
||||||
VisitExpr(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.AddDeclRef(E->getConstructor(), Record);
|
||||||
Writer.AddSourceLocation(E->getLocation(), Record);
|
Writer.AddSourceLocation(E->getLocation(), Record);
|
||||||
Record.push_back(E->isElidable());
|
Record.push_back(E->isElidable());
|
||||||
Record.push_back(E->requiresZeroInitialization());
|
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
|
Record.push_back(E->getConstructionKind()); // FIXME: stable encoding
|
||||||
Code = pch::EXPR_CXX_CONSTRUCT;
|
Code = pch::EXPR_CXX_CONSTRUCT;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
// Test this without pch.
|
// 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 -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;
|
int integer;
|
||||||
double floating;
|
double floating;
|
||||||
|
@ -36,4 +36,4 @@ cxx_null_ptr_result null_ptr = nullptr;
|
||||||
|
|
||||||
// CXXTypeidExpr
|
// CXXTypeidExpr
|
||||||
typeid_result1 typeid_1 = 0;
|
typeid_result1 typeid_1 = 0;
|
||||||
typeid_result2 typeid_2 = 0;
|
typeid_result2 typeid_2 = 0;
|
||||||
|
|
Loading…
Reference in New Issue