diff options
author | Anders Carlsson <andersca@mac.com> | 2010-01-23 19:22:30 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2010-01-23 19:22:30 +0000 |
commit | 1f24350dac272caea50ae9a52f1b85722fd3557a (patch) | |
tree | b1b558393f0220d4f4563a1ff8615cc35291cf46 /lib/Sema/SemaInit.cpp | |
parent | e6dddfd907f6ea58daed5e26eeaacd893d98db9b (diff) |
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
Diffstat (limited to 'lib/Sema/SemaInit.cpp')
-rw-r--r-- | lib/Sema/SemaInit.cpp | 58 |
1 files changed, 36 insertions, 22 deletions
diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index c5a10b54fd..06f4ee6351 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -76,32 +76,46 @@ CheckSingleInitializer(const InitializedEntity *Entity, 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 = |