Add a BuildCXXTemporaryObjectExpr and use it so default arguments will be instantiated correctly for temporary object expressions.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@80206 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp
index e93624a..2f797da 100644
--- a/lib/Sema/SemaDeclCXX.cpp
+++ b/lib/Sema/SemaDeclCXX.cpp
@@ -2467,7 +2467,7 @@
                                                                 Elidable,
                                                                 Exprs,
                                                                 NumExprs));
-  // default arguments must be added to constructor call expression.
+  // Default arguments must be added to constructor call expression.
   FunctionDecl *FDecl = cast<FunctionDecl>(Constructor);
   unsigned NumArgsInProto = FDecl->param_size();
   for (unsigned j = NumExprs; j != NumArgsInProto; j++) {
@@ -2484,6 +2484,37 @@
   return move(Temp);
 }
 
+Sema::OwningExprResult
+Sema::BuildCXXTemporaryObjectExpr(CXXConstructorDecl *Constructor, 
+                                  QualType Ty, 
+                                  SourceLocation TyBeginLoc, 
+                                  MultiExprArg Args,
+                                  SourceLocation RParenLoc) {
+  CXXTemporaryObjectExpr *E 
+    = new (Context) CXXTemporaryObjectExpr(Context, Constructor, Ty, TyBeginLoc, 
+                                           (Expr **)Args.get(),
+                                           Args.size(), RParenLoc);
+  
+  ExprOwningPtr<CXXTemporaryObjectExpr> Temp(this, E);
+
+    // Default arguments must be added to constructor call expression.
+  FunctionDecl *FDecl = cast<FunctionDecl>(Constructor);
+  unsigned NumArgsInProto = FDecl->param_size();
+  for (unsigned j = Args.size(); j != NumArgsInProto; j++) {
+    ParmVarDecl *Param = FDecl->getParamDecl(j);
+
+    OwningExprResult ArgExpr = BuildCXXDefaultArgExpr(TyBeginLoc, FDecl, Param);
+    if (ArgExpr.isInvalid())
+      return ExprError();
+
+    Temp->setArg(j, ArgExpr.takeAs<Expr>());
+  }
+
+  Args.release();
+  return move(Temp);
+}
+
+
 bool Sema::InitializeVarWithConstructor(VarDecl *VD, 
                                         CXXConstructorDecl *Constructor,
                                         QualType DeclInitType,