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/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp
index a4c3b0d..8592494 100644
--- a/lib/Sema/SemaExprCXX.cpp
+++ b/lib/Sema/SemaExprCXX.cpp
@@ -239,9 +239,8 @@
   if (const RecordType *RT = Ty->getAs<RecordType>()) {
     CXXRecordDecl *Record = cast<CXXRecordDecl>(RT->getDecl());
 
-    // FIXME: We should always create a CXXTemporaryObjectExpr here unless
-    // both the ctor and dtor are trivial.
-    if (NumExprs > 1 || Record->hasUserDeclaredConstructor()) {
+    if (NumExprs > 1 || !Record->hasTrivialConstructor() || 
+        !Record->hasTrivialDestructor()) {
       CXXConstructorDecl *Constructor
         = PerformInitializationByConstructor(Ty, Exprs, NumExprs,
                                              TypeRange.getBegin(),
@@ -253,11 +252,13 @@
       if (!Constructor)
         return ExprError();
 
-      exprs.release();
-      Expr *E = new (Context) CXXTemporaryObjectExpr(Context, Constructor, 
-                                                     Ty, TyBeginLoc, Exprs,
-                                                     NumExprs, RParenLoc);
-      return MaybeBindToTemporary(E);
+      OwningExprResult Result = 
+        BuildCXXTemporaryObjectExpr(Constructor, Ty, TyBeginLoc, 
+                                    move(exprs), RParenLoc);
+      if (Result.isInvalid())
+        return ExprError();
+      
+      return MaybeBindToTemporary(Result.takeAs<Expr>());
     }
 
     // Fall through to value-initialize an object of class type that