When declaring a variable that has a constructor and a direct initializer, for example:

struct X {
  X(int, int);
};

X x(10, 10);

we model that as

X x = X(10, 10); 

inserting a temporary object expr.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69227 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp
index 6e7256c..cc70dc4 100644
--- a/lib/Sema/SemaDeclCXX.cpp
+++ b/lib/Sema/SemaDeclCXX.cpp
@@ -1796,15 +1796,19 @@
                                            IK_Direct);
     if (!Constructor)
       RealDecl->setInvalidDecl();
-    else
-      Exprs.release();
+    else {
+      // Let clients know that initialization was done with a direct
+      // initializer.
+      VDecl->setCXXDirectInitializer(true);
 
-    // Let clients know that initialization was done with a direct
-    // initializer.
-    VDecl->setCXXDirectInitializer(true);
-
-    // FIXME: Add ExprTys and Constructor to the RealDecl as part of
-    // the initializer.
+      Expr *Temp = 
+        new (Context) CXXTemporaryObjectExpr(Constructor, DeclInitType,
+                                             SourceLocation(), 
+                                             (Expr**)Exprs.release(), 
+                                             NumExprs,
+                                             SourceLocation());
+      AddInitializerToDecl(Dcl, ExprArg(*this, Temp), /*DirectInit=*/true);
+    }
     return;
   }