[cfe-commits] r94324 - /cfe/trunk/lib/Sema/SemaInit.cpp

Anders Carlsson andersca at mac.com
Sat Jan 23 11:22:30 PST 2010


Author: andersca
Date: Sat Jan 23 13:22:30 2010
New Revision: 94324

URL: http://llvm.org/viewvc/llvm-project?rev=94324&view=rev
Log:
When an InitializedEntity is passed to CheckSingleInitializer, call the new Sema::PerformCopyInitialization overload.

Modified:
    cfe/trunk/lib/Sema/SemaInit.cpp

Modified: cfe/trunk/lib/Sema/SemaInit.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaInit.cpp?rev=94324&r1=94323&r2=94324&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaInit.cpp (original)
+++ cfe/trunk/lib/Sema/SemaInit.cpp Sat Jan 23 13:22:30 2010
@@ -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 =





More information about the cfe-commits mailing list