summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2013-09-06 01:22:42 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2013-09-06 01:22:42 +0000
commit4d2bbd78ff7eb12adb27f5583219bb849e55f5dd (patch)
tree96ea02923cf307a29bcbf419facecff66f406b64
parentbc8c734fa715cbad78d76707d0699366e28b46ec (diff)
downloadbcm5719-llvm-4d2bbd78ff7eb12adb27f5583219bb849e55f5dd.tar.gz
bcm5719-llvm-4d2bbd78ff7eb12adb27f5583219bb849e55f5dd.zip
When creating an implicit conversion sequence for a reference of type T from an
initializer list containing a single element of type T, be sure to mark the sequence as a list conversion sequence so that it is known to be worse than an implicit conversion sequence that initializes a std::initializer_list object. llvm-svn: 190115
-rw-r--r--clang/lib/Sema/SemaOverload.cpp17
-rw-r--r--clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp7
2 files changed, 19 insertions, 5 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index a8b0bd27b98..54b05478108 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -509,6 +509,11 @@ void UserDefinedConversionSequence::DebugPrint() const {
/// error. Useful for debugging overloading issues.
void ImplicitConversionSequence::DebugPrint() const {
raw_ostream &OS = llvm::errs();
+ if (isListInitializationSequence()) {
+ OS << "List-initialization sequence: ";
+ if (isStdInitializerListElement())
+ OS << "Worst std::initializer_list element conversion: ";
+ }
switch (ConversionKind) {
case StandardConversion:
OS << "Standard conversion: ";
@@ -4524,11 +4529,13 @@ TryListConversion(Sema &S, InitListExpr *From, QualType ToType,
= S.CompareReferenceRelationship(From->getLocStart(), T1, T2, dummy1,
dummy2, dummy3);
- if (RefRelationship >= Sema::Ref_Related)
- return TryReferenceInit(S, Init, ToType,
- /*FIXME:*/From->getLocStart(),
- SuppressUserConversions,
- /*AllowExplicit=*/false);
+ if (RefRelationship >= Sema::Ref_Related) {
+ Result = TryReferenceInit(S, Init, ToType, /*FIXME*/From->getLocStart(),
+ SuppressUserConversions,
+ /*AllowExplicit=*/false);
+ Result.setListInitializationSequence();
+ return Result;
+ }
}
// Otherwise, we bind the reference to a temporary created from the
diff --git a/clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp b/clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp
index 071098440cd..d4098a45b59 100644
--- a/clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp
+++ b/clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp
@@ -218,3 +218,10 @@ namespace deleted_copy {
std::initializer_list<X> x{1}; // expected-error {{invokes deleted constructor}}
}
+
+namespace RefVersusInitList {
+ struct S {};
+ void f(const S &) = delete;
+ void f(std::initializer_list<S>);
+ void g(S s) { f({S()}); }
+}
OpenPOWER on IntegriCloud