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;
}