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/ExprCXX.cpp b/lib/AST/ExprCXX.cpp
index 07d794e..b21b413 100644
--- a/lib/AST/ExprCXX.cpp
+++ b/lib/AST/ExprCXX.cpp
@@ -61,6 +61,14 @@
   return child_iterator();
 }
 
+// CXXTemporaryObjectExpr
+Stmt::child_iterator CXXTemporaryObjectExpr::child_begin() { 
+  return child_iterator(Args);
+}
+Stmt::child_iterator CXXTemporaryObjectExpr::child_end() {
+  return child_iterator(Args + NumArgs);
+}
+
 // CXXZeroInitValueExpr
 Stmt::child_iterator CXXZeroInitValueExpr::child_begin() { 
   return child_iterator();
@@ -219,3 +227,23 @@
   default:                          return "<invalid cast>";
   }
 }
+
+CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(CXXConstructorDecl *Cons,
+                                               QualType writtenTy,
+                                               SourceLocation tyBeginLoc, 
+                                               Expr **Args,
+                                               unsigned NumArgs, 
+                                               SourceLocation rParenLoc)
+  : Expr(CXXTemporaryObjectExprClass, writtenTy),
+    TyBeginLoc(tyBeginLoc), RParenLoc(rParenLoc),
+    Constructor(Cons), Args(0), NumArgs(NumArgs) {
+  if (NumArgs > 0) {
+    this->Args = new Stmt*[NumArgs];
+    for (unsigned i = 0; i < NumArgs; ++i)
+      this->Args[i] = Args[i];
+  }
+}
+
+CXXTemporaryObjectExpr::~CXXTemporaryObjectExpr() {
+  delete [] Args;
+}