diff options
Diffstat (limited to 'clang/lib/AST/StmtSerialization.cpp')
-rw-r--r-- | clang/lib/AST/StmtSerialization.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/clang/lib/AST/StmtSerialization.cpp b/clang/lib/AST/StmtSerialization.cpp index 02ccde3da26..39330ce3352 100644 --- a/clang/lib/AST/StmtSerialization.cpp +++ b/clang/lib/AST/StmtSerialization.cpp @@ -13,6 +13,7 @@ //===----------------------------------------------------------------------===// #include "clang/Basic/TypeTraits.h" +#include "clang/AST/DeclCXX.h" #include "clang/AST/Expr.h" #include "clang/AST/ExprCXX.h" #include "clang/AST/ExprObjC.h" @@ -232,6 +233,9 @@ Stmt* Stmt::Create(Deserializer& D, ASTContext& C) { case CXXThisExprClass: return CXXThisExpr::CreateImpl(D, C); + case CXXTemporaryObjectExprClass: + return CXXTemporaryObjectExpr::CreateImpl(D, C); + case CXXZeroInitValueExprClass: return CXXZeroInitValueExpr::CreateImpl(D, C); @@ -1441,6 +1445,40 @@ CXXThisExpr* CXXThisExpr::CreateImpl(llvm::Deserializer& D, ASTContext&) { return new CXXThisExpr(Loc, Ty); } +void CXXTemporaryObjectExpr::EmitImpl(llvm::Serializer& S) const { + S.Emit(getType()); + S.Emit(TyBeginLoc); + S.Emit(RParenLoc); + S.EmitPtr(cast<Decl>(Constructor)); + S.EmitInt(NumArgs); + if (NumArgs > 0) + S.BatchEmitOwnedPtrs(NumArgs, Args); +} + +CXXTemporaryObjectExpr * +CXXTemporaryObjectExpr::CreateImpl(llvm::Deserializer& D, ASTContext& C) { + QualType writtenTy = QualType::ReadVal(D); + SourceLocation tyBeginLoc = SourceLocation::ReadVal(D); + SourceLocation rParenLoc = SourceLocation::ReadVal(D); + CXXConstructorDecl * Cons = cast_or_null<CXXConstructorDecl>(D.ReadPtr<Decl>()); + unsigned NumArgs = D.ReadInt(); + Stmt** Args = 0; + if (NumArgs > 0) { + Args = new Stmt*[NumArgs]; + D.BatchReadOwnedPtrs(NumArgs, Args, C); + } + + CXXTemporaryObjectExpr * Result + = new CXXTemporaryObjectExpr(Cons, writtenTy, tyBeginLoc, + (Expr**)Args, NumArgs, rParenLoc); + + if (NumArgs > 0) + delete [] Args; + + return Result; +} + + void CXXZeroInitValueExpr::EmitImpl(Serializer& S) const { S.Emit(getType()); S.Emit(TyBeginLoc); |