]> granicus.if.org Git - clang/commitdiff
When declaring a variable that has a constructor and a direct initializer, for example:
authorAnders Carlsson <andersca@mac.com>
Wed, 15 Apr 2009 21:48:18 +0000 (21:48 +0000)
committerAnders Carlsson <andersca@mac.com>
Wed, 15 Apr 2009 21:48:18 +0000 (21:48 +0000)
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

lib/Sema/SemaDeclCXX.cpp

index 6e7256c34d439b228f2043a224ea447e96f539da..cc70dc4a5cd3a58b0f7d5660138ad5a9c8a29865 100644 (file)
@@ -1796,15 +1796,19 @@ void Sema::AddCXXDirectInitializerToDecl(DeclPtrTy Dcl,
                                            IK_Direct);
     if (!Constructor)
       RealDecl->setInvalidDecl();
-    else
-      Exprs.release();
-
-    // 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.
+    else {
+      // Let clients know that initialization was done with a direct
+      // initializer.
+      VDecl->setCXXDirectInitializer(true);
+
+      Expr *Temp = 
+        new (Context) CXXTemporaryObjectExpr(Constructor, DeclInitType,
+                                             SourceLocation(), 
+                                             (Expr**)Exprs.release(), 
+                                             NumExprs,
+                                             SourceLocation());
+      AddInitializerToDecl(Dcl, ExprArg(*this, Temp), /*DirectInit=*/true);
+    }
     return;
   }