diff options
Diffstat (limited to 'clang/lib/Frontend')
-rw-r--r-- | clang/lib/Frontend/PCHReaderStmt.cpp | 26 | ||||
-rw-r--r-- | clang/lib/Frontend/PCHWriterStmt.cpp | 24 |
2 files changed, 50 insertions, 0 deletions
diff --git a/clang/lib/Frontend/PCHReaderStmt.cpp b/clang/lib/Frontend/PCHReaderStmt.cpp index a2334d7330b..5f9ee3b25f8 100644 --- a/clang/lib/Frontend/PCHReaderStmt.cpp +++ b/clang/lib/Frontend/PCHReaderStmt.cpp @@ -147,6 +147,7 @@ namespace { unsigned VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E); unsigned VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E); + unsigned VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E); unsigned VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E); unsigned VisitOverloadExpr(OverloadExpr *E); @@ -1185,6 +1186,26 @@ PCHStmtReader::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){ } unsigned +PCHStmtReader::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) { + VisitExpr(E); + unsigned NumExprs = 0; + + unsigned NumTemplateArgs = Record[Idx++]; + assert((NumTemplateArgs != 0) == E->hasExplicitTemplateArgs() && + "Read wrong record during creation ?"); + if (E->hasExplicitTemplateArgs()) + NumExprs + = ReadExplicitTemplateArgumentList(E->getExplicitTemplateArgs(), + NumTemplateArgs, StmtStack.end()); + + E->setDeclName(Reader.ReadDeclarationName(Record, Idx)); + E->setLocation(Reader.ReadSourceLocation(Record, Idx)); + E->setQualifierRange(Reader.ReadSourceRange(Record, Idx)); + E->setQualifier(Reader.ReadNestedNameSpecifier(Record, Idx)); + return NumExprs; +} + +unsigned PCHStmtReader::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) { VisitExpr(E); assert(Record[Idx] == E->arg_size() && "Read wrong record during creation ?"); @@ -1635,6 +1656,11 @@ Stmt *PCHReader::ReadStmt(llvm::BitstreamCursor &Cursor) { /*NumTemplateArgs=*/Record[PCHStmtReader::NumExprFields]); break; + case pch::EXPR_CXX_DEPENDENT_SCOPE_DECL_REF: + S = DependentScopeDeclRefExpr::CreateEmpty(*Context, + /*NumTemplateArgs=*/Record[PCHStmtReader::NumExprFields]); + break; + case pch::EXPR_CXX_UNRESOLVED_CONSTRUCT: S = CXXUnresolvedConstructExpr::CreateEmpty(*Context, /*NumArgs=*/Record[PCHStmtReader::NumExprFields]); diff --git a/clang/lib/Frontend/PCHWriterStmt.cpp b/clang/lib/Frontend/PCHWriterStmt.cpp index a3f18dea39a..d3e1e1aab74 100644 --- a/clang/lib/Frontend/PCHWriterStmt.cpp +++ b/clang/lib/Frontend/PCHWriterStmt.cpp @@ -137,6 +137,7 @@ namespace { void VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E); void VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E); + void VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E); void VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E); void VisitOverloadExpr(OverloadExpr *E); @@ -1104,6 +1105,29 @@ PCHStmtWriter::VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E){ } void +PCHStmtWriter::VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) { + VisitExpr(E); + + // Don't emit anything here, NumTemplateArgs must be emitted first. + + if (E->hasExplicitTemplateArgs()) { + const ExplicitTemplateArgumentList &Args = E->getExplicitTemplateArgs(); + assert(Args.NumTemplateArgs && + "Num of template args was zero! PCH reading will mess up!"); + Record.push_back(Args.NumTemplateArgs); + AddExplicitTemplateArgumentList(Args); + } else { + Record.push_back(0); + } + + Writer.AddDeclarationName(E->getDeclName(), Record); + Writer.AddSourceLocation(E->getLocation(), Record); + Writer.AddSourceRange(E->getQualifierRange(), Record); + Writer.AddNestedNameSpecifier(E->getQualifier(), Record); + Code = pch::EXPR_CXX_DEPENDENT_SCOPE_DECL_REF; +} + +void PCHStmtWriter::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr *E) { VisitExpr(E); Record.push_back(E->arg_size()); |