aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaInit.cpp
diff options
context:
space:
mode:
authorSebastian Redl <sebastian.redl@getdesigned.at>2011-12-22 18:58:38 +0000
committerSebastian Redl <sebastian.redl@getdesigned.at>2011-12-22 18:58:38 +0000
commitcf15cef8447e8b3ae08e81ad25ae9eb443038acf (patch)
treee3679bbf9b30c694c3ef54e72cd175803971c62f /lib/Sema/SemaInit.cpp
parent62f13c9e9e87b14c1d387891575ccf5dfac7b673 (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.cpp18
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) {