From: Richard Smith Date: Fri, 6 Sep 2013 01:22:42 +0000 (+0000) Subject: When creating an implicit conversion sequence for a reference of type T from an X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3082be2f92c5d273ada989c1a13bcb46bc14e4c7;p=clang 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@190115 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index a8b0bd27b9..54b0547810 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/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/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp b/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp index 071098440c..d4098a45b5 100644 --- a/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp +++ b/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp @@ -218,3 +218,10 @@ namespace deleted_copy { std::initializer_list x{1}; // expected-error {{invokes deleted constructor}} } + +namespace RefVersusInitList { + struct S {}; + void f(const S &) = delete; + void f(std::initializer_list); + void g(S s) { f({S()}); } +}