Part one of handling C++ functional casts. This handles semantic
analysis and AST-building for the cases where we have N != 1
arguments. For N == 1 arguments, we need to finish the C++
implementation of explicit type casts (C++ [expr.cast]).


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62329 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/StmtSerialization.cpp b/lib/AST/StmtSerialization.cpp
index 02ccde3..39330ce 100644
--- a/lib/AST/StmtSerialization.cpp
+++ b/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 @@
     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 @@
   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);