]> granicus.if.org Git - clang/commitdiff
If a class has a non-trivial constructor that doesn't take any arguments, we will...
authorAnders Carlsson <andersca@mac.com>
Thu, 16 Apr 2009 23:50:50 +0000 (23:50 +0000)
committerAnders Carlsson <andersca@mac.com>
Thu, 16 Apr 2009 23:50:50 +0000 (23:50 +0000)
struct S {
  S();
};

void f() {
 S s;
}

's' here will implicitly be declared as.

S s = S();

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69326 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/Sema.h
lib/Sema/SemaDecl.cpp
lib/Sema/SemaDeclCXX.cpp

index fd708516f4e66a3b6dfe9198052aa6dee880acdd..ef20a6a3302db4fc5c54dec31cfad179106f2f43 100644 (file)
@@ -1418,6 +1418,13 @@ public:
                                              SourceLocation *CommaLocs,
                                              SourceLocation RParenLoc);
 
+  /// InitializeVarWithConstructor - Creates an implicit 
+  /// CXXTemporaryObjectExpr and sets it as the passed in VarDecl initializer.
+  void InitializeVarWithConstructor(VarDecl *VD, 
+                                    CXXConstructorDecl *Constructor,
+                                    QualType DeclInitType, 
+                                    Expr **Exprs, unsigned NumExprs);
+  
   /// InitializationKind - Represents which kind of C++ initialization
   /// [dcl.init] a routine is to perform.
   enum InitializationKind {
index 94b3b76a3ba0c4ec5f6f35e53fa48f90927df08e..a2b565beb602105e480d38dbdfc8325e14b3c82a 100644 (file)
@@ -2552,7 +2552,9 @@ void Sema::ActOnUninitializedDecl(DeclPtrTy dcl) {
       if (const ArrayType *Array = Context.getAsArrayType(Type))
         InitType = Array->getElementType();
       if (!Var->hasExternalStorage() && InitType->isRecordType()) {
-        const CXXConstructorDecl *Constructor = 0;
+        CXXRecordDecl *RD = 
+          cast<CXXRecordDecl>(InitType->getAsRecordType()->getDecl());
+        CXXConstructorDecl *Constructor = 0;
         if (!RequireCompleteType(Var->getLocation(), InitType, 
                                     diag::err_invalid_incomplete_type_use))
           Constructor
@@ -2564,6 +2566,8 @@ void Sema::ActOnUninitializedDecl(DeclPtrTy dcl) {
                                                  IK_Default);
         if (!Constructor)
           Var->setInvalidDecl();
+        else if (!RD->hasTrivialConstructor()) 
+          InitializeVarWithConstructor(Var, Constructor, InitType, 0, 0);
       }
     }
 
index 8e2302ed64f8c4206954fe34a83d901317758ef5..e3195a9b281569792f1a6aea2a7fcff36e106ed6 100644 (file)
@@ -1764,6 +1764,18 @@ Sema::DeclPtrTy Sema::ActOnNamespaceAliasDef(Scope *S,
   return DeclPtrTy::make(AliasDecl);
 }
 
+void Sema::InitializeVarWithConstructor(VarDecl *VD, 
+                                        CXXConstructorDecl *Constructor,
+                                        QualType DeclInitType, 
+                                        Expr **Exprs, unsigned NumExprs) {
+  Expr *Temp = 
+    new (Context) CXXTemporaryObjectExpr(Constructor, DeclInitType,
+                                         SourceLocation(), 
+                                         Exprs, NumExprs,
+                                         SourceLocation());
+  VD->setInit(Temp);
+}
+
 /// AddCXXDirectInitializerToDecl - This action is called immediately after 
 /// ActOnDeclarator, when a C++ direct initializer is present.
 /// e.g: "int x(1);"
@@ -1827,17 +1839,9 @@ void Sema::AddCXXDirectInitializerToDecl(DeclPtrTy Dcl,
     if (!Constructor)
       RealDecl->setInvalidDecl();
     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());
-      VDecl->setInit(Temp);
+      InitializeVarWithConstructor(VDecl, Constructor, DeclInitType, 
+                                   (Expr**)Exprs.release(), NumExprs);
     }
     return;
   }