diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h
index 52aa1a0..a5a0723 100644
--- a/lib/Sema/Sema.h
+++ b/lib/Sema/Sema.h
@@ -1774,6 +1774,12 @@
                                          bool Elidable,
                                          Expr **Exprs, unsigned NumExprs);
   
+  OwningExprResult BuildCXXTemporaryObjectExpr(CXXConstructorDecl *Cons, 
+                                               QualType writtenTy, 
+                                               SourceLocation tyBeginLoc, 
+                                               MultiExprArg Args,
+                                               SourceLocation rParenLoc);
+                                               
   /// BuildCXXDefaultArgExpr - Creates a CXXDefaultArgExpr, instantiating
   /// the default expr if needed.
   OwningExprResult BuildCXXDefaultArgExpr(SourceLocation CallLoc,
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, 
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
