When an InitializedEntity is passed to CheckSingleInitializer, call the new Sema::PerformCopyInitialization overload.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@94324 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp
index c5a10b5..06f4ee6 100644
--- a/lib/Sema/SemaInit.cpp
+++ b/lib/Sema/SemaInit.cpp
@@ -76,32 +76,46 @@
   QualType InitType = InitExpr->getType();
 
   if (S.getLangOptions().CPlusPlus) {
-    // FIXME: I dislike this error message. A lot.
-    if (S.PerformImplicitConversion(InitExpr, DeclType, 
-                                    Sema::AA_Initializing, 
-                                    /*DirectInit=*/false)) {
-      ImplicitConversionSequence ICS;
-      OverloadCandidateSet CandidateSet;
-      if (S.IsUserDefinedConversion(InitExpr, DeclType, ICS.UserDefined,
-                              CandidateSet,
-                              true, false, false) != OR_Ambiguous) {
+    if (Entity) {
+      assert(Entity->getType() == DeclType);
+      
+      // C++ [dcl.init.aggr]p2:
+      //   Each member is copy-initialized from the corresponding
+      //   initializer-clause
+      Sema::OwningExprResult Result = 
+        S.PerformCopyInitialization(*Entity, InitExpr->getLocStart(),
+                                    S.Owned(InitExpr));
+
+      return move(Result);
+    } else {
+      // FIXME: I dislike this error message. A lot.
+      if (S.PerformImplicitConversion(InitExpr, DeclType, 
+                                      Sema::AA_Initializing, 
+                                      /*DirectInit=*/false)) {
+        ImplicitConversionSequence ICS;
+        OverloadCandidateSet CandidateSet;
+        if (S.IsUserDefinedConversion(InitExpr, DeclType, ICS.UserDefined,
+                                      CandidateSet,
+                                      true, false, false) != OR_Ambiguous) {
+          S.Diag(InitExpr->getSourceRange().getBegin(),
+                        diag::err_typecheck_convert_incompatible)
+                          << DeclType << InitExpr->getType() 
+                          << Sema::AA_Initializing
+                          << InitExpr->getSourceRange();
+          return S.ExprError();
+        }
         S.Diag(InitExpr->getSourceRange().getBegin(),
-                      diag::err_typecheck_convert_incompatible)
-                      << DeclType << InitExpr->getType() << Sema::AA_Initializing
-                      << InitExpr->getSourceRange();
+               diag::err_typecheck_convert_ambiguous)
+              << DeclType << InitExpr->getType() << InitExpr->getSourceRange();
+        S.PrintOverloadCandidates(CandidateSet, Sema::OCD_AllCandidates, 
+                                  &InitExpr, 1);
+      
         return S.ExprError();
       }
-      S.Diag(InitExpr->getSourceRange().getBegin(),
-             diag::err_typecheck_convert_ambiguous)
-            << DeclType << InitExpr->getType() << InitExpr->getSourceRange();
-      S.PrintOverloadCandidates(CandidateSet, Sema::OCD_AllCandidates, 
-                                &InitExpr, 1);
-      
-      return S.ExprError();
-    }
     
-    Init.release();
-    return S.Owned(InitExpr);
+      Init.release();
+      return S.Owned(InitExpr);
+    }
   }
 
   Sema::AssignConvertType ConvTy =