If a class has a non-trivial constructor that doesn't take any arguments, we will now make an implicit CXXTemporaryObjectExpr. So 

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
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp
index 94b3b76..a2b565b 100644
--- a/lib/Sema/SemaDecl.cpp
+++ b/lib/Sema/SemaDecl.cpp
@@ -2552,7 +2552,9 @@
       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 @@
                                                  IK_Default);
         if (!Constructor)
           Var->setInvalidDecl();
+        else if (!RD->hasTrivialConstructor()) 
+          InitializeVarWithConstructor(Var, Constructor, InitType, 0, 0);
       }
     }