aboutsummaryrefslogtreecommitdiff
path: root/lib/Frontend/PCHWriterStmt.cpp
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2010-06-28 09:31:42 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2010-06-28 09:31:42 +0000
commit17cfdeda476aa8899f0ccedd9cb9cdb76e89b6b4 (patch)
tree825a41e0746e4d7a54a299d7f77537682b85ff18 /lib/Frontend/PCHWriterStmt.cpp
parentdc767e368471288bef8716d19b0e929647246bfc (diff)
Fix PCH emitting/reading for template arguments that contain expressions.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@106996 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend/PCHWriterStmt.cpp')
-rw-r--r--lib/Frontend/PCHWriterStmt.cpp42
1 files changed, 42 insertions, 0 deletions
diff --git a/lib/Frontend/PCHWriterStmt.cpp b/lib/Frontend/PCHWriterStmt.cpp
index 68b2daed4d..cd58bd0236 100644
--- a/lib/Frontend/PCHWriterStmt.cpp
+++ b/lib/Frontend/PCHWriterStmt.cpp
@@ -1025,6 +1025,40 @@ void PCHStmtWriter::VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E) {
Code = pch::EXPR_CXX_EXPR_WITH_TEMPORARIES;
}
+/// \brief Return the number of Exprs contained in the given TemplateArgument.
+static unsigned NumExprsContainedIn(const TemplateArgument Arg) {
+ switch (Arg.getKind()) {
+ default: break;
+ case TemplateArgument::Expression:
+ return 1;
+ case TemplateArgument::Pack: {
+ unsigned Count = 0;
+ for (TemplateArgument::pack_iterator I=Arg.pack_begin(), E=Arg.pack_end();
+ I != E; ++I)
+ Count += NumExprsContainedIn(*I);
+ return Count;
+ }
+ }
+
+ return 0;
+}
+
+/// \brief Return the number of Exprs contained in the given
+/// TemplateArgumentLoc.
+static
+unsigned NumExprsContainedIn(const TemplateArgumentLoc *Args,unsigned NumArgs) {
+ unsigned Count = 0;
+ for (unsigned i=0; i != NumArgs; ++i) {
+ const TemplateArgument &TemplA = Args[i].getArgument();
+ Count += NumExprsContainedIn(TemplA);
+ if (TemplA.getKind() == TemplateArgument::Expression &&
+ TemplA.getAsExpr() != Args[i].getLocInfo().getAsExpr())
+ ++Count; // 1 in TemplateArgumentLocInfo.
+ }
+
+ return Count;
+}
+
void
PCHStmtWriter::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){
VisitExpr(E);
@@ -1035,6 +1069,8 @@ PCHStmtWriter::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){
Record.push_back(E->getNumTemplateArgs());
Writer.AddSourceLocation(E->getLAngleLoc(), Record);
Writer.AddSourceLocation(E->getRAngleLoc(), Record);
+ Record.push_back(NumExprsContainedIn(E->getTemplateArgs(),
+ E->getNumTemplateArgs()));
for (int i=0, e = E->getNumTemplateArgs(); i != e; ++i)
Writer.AddTemplateArgumentLoc(E->getTemplateArgs()[i], Record);
} else {
@@ -1080,6 +1116,8 @@ void PCHStmtWriter::VisitOverloadExpr(OverloadExpr *E) {
Record.push_back(Args.NumTemplateArgs);
Writer.AddSourceLocation(Args.LAngleLoc, Record);
Writer.AddSourceLocation(Args.RAngleLoc, Record);
+ Record.push_back(NumExprsContainedIn(Args.getTemplateArgs(),
+ Args.NumTemplateArgs));
for (unsigned i=0; i != Args.NumTemplateArgs; ++i)
Writer.AddTemplateArgumentLoc(Args.getTemplateArgs()[i], Record);
} else {
@@ -1178,6 +1216,8 @@ void PCHWriter::WriteSubStmt(Stmt *S) {
void PCHWriter::FlushStmts() {
RecordData Record;
PCHStmtWriter Writer(*this, Record);
+
+ EmittingStmts = true;
for (unsigned I = 0, N = StmtsToEmit.size(); I != N; ++I) {
++NumStatements;
@@ -1209,5 +1249,7 @@ void PCHWriter::FlushStmts() {
Stream.EmitRecord(pch::STMT_STOP, Record);
}
+ EmittingStmts = false;
+
StmtsToEmit.clear();
}