diff options
author | Sebastian Redl <sebastian.redl@getdesigned.at> | 2011-12-22 18:58:38 +0000 |
---|---|---|
committer | Sebastian Redl <sebastian.redl@getdesigned.at> | 2011-12-22 18:58:38 +0000 |
commit | cf15cef8447e8b3ae08e81ad25ae9eb443038acf (patch) | |
tree | e3679bbf9b30c694c3ef54e72cd175803971c62f /lib/Sema/SemaInit.cpp | |
parent | 62f13c9e9e87b14c1d387891575ccf5dfac7b673 (diff) |
Overloading for initializer list construction.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@147156 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaInit.cpp')
-rw-r--r-- | lib/Sema/SemaInit.cpp | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index ad29bce8ac..abaeb18fbd 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -2436,6 +2436,7 @@ bool InitializationSequence::isAmbiguous() const { case FK_ReferenceInitOverloadFailed: case FK_UserConversionOverloadFailed: case FK_ConstructorOverloadFailed: + case FK_ListConstructorOverloadFailed: return FailedOverloadResult == OR_Ambiguous; } @@ -2849,8 +2850,8 @@ static bool TryListConstructionSpecialCases(Sema &S, Args, NumArgs, CandidateSet, /*SuppressUserConversions*/ false); Sequence.SetOverloadFailure( - InitializationSequence::FK_ConstructorOverloadFailed, - OR_Deleted); + InitializationSequence::FK_ListConstructorOverloadFailed, + OR_Deleted); } else Sequence.AddConstructorInitializationStep(DefaultConstructor, DefaultConstructor->getAccess(), @@ -2961,8 +2962,9 @@ static void TryConstructorInitialization(Sema &S, OverloadCandidateSet::iterator Best; if (OverloadingResult Result = CandidateSet.BestViableFunction(S, DeclLoc, Best)) { - Sequence.SetOverloadFailure( - InitializationSequence::FK_ConstructorOverloadFailed, + Sequence.SetOverloadFailure(FromInitList ? + InitializationSequence::FK_ListConstructorOverloadFailed : + InitializationSequence::FK_ConstructorOverloadFailed, Result); return; } @@ -5428,12 +5430,20 @@ bool InitializationSequence::Diagnose(Sema &S, << (DestType->isRecordType()) << DestType << Args[0]->getSourceRange(); break; + case FK_ListConstructorOverloadFailed: case FK_ConstructorOverloadFailed: { SourceRange ArgsRange; if (NumArgs) ArgsRange = SourceRange(Args[0]->getLocStart(), Args[NumArgs - 1]->getLocEnd()); + if (Failure == FK_ListConstructorOverloadFailed) { + assert(NumArgs == 1 && "List construction from other than 1 argument."); + InitListExpr *InitList = cast<InitListExpr>(Args[0]); + Args = InitList->getInits(); + NumArgs = InitList->getNumInits(); + } + // FIXME: Using "DestType" for the entity we're printing is probably // bad. switch (FailedOverloadResult) { |