@@ -246,6 +246,7 @@ void StandardConversionSequence::setAsIdentityConversion() {
246246 BindsToRvalue = false;
247247 BindsImplicitObjectArgumentWithoutRefQualifier = false;
248248 ObjCLifetimeConversionBinding = false;
249+ FromBracedInitList = false;
249250 CopyConstructor = nullptr;
250251}
251252
@@ -1692,12 +1693,14 @@ TryUserDefinedConversion(Sema &S, Expr *From, QualType ToType,
16921693 // has a single element of type cv U, where U is X or a class derived
16931694 // from X, the implicit conversion sequence has Exact Match rank if U is
16941695 // X, or Conversion rank if U is derived from X.
1696+ bool FromListInit = false;
16951697 if (const auto *InitList = dyn_cast<InitListExpr>(From);
16961698 InitList && InitList->getNumInits() == 1 &&
16971699 !S.isInitListConstructor(Constructor)) {
16981700 const Expr *SingleInit = InitList->getInit(0);
16991701 FromType = SingleInit->getType();
17001702 FromLoc = SingleInit->getBeginLoc();
1703+ FromListInit = true;
17011704 } else {
17021705 FromType = From->getType();
17031706 FromLoc = From->getBeginLoc();
@@ -1715,6 +1718,7 @@ TryUserDefinedConversion(Sema &S, Expr *From, QualType ToType,
17151718 ICS.Standard.setAsIdentityConversion();
17161719 ICS.Standard.setFromType(FromType);
17171720 ICS.Standard.setAllToTypes(ToType);
1721+ ICS.Standard.FromBracedInitList = FromListInit;
17181722 ICS.Standard.CopyConstructor = Constructor;
17191723 ICS.Standard.FoundCopyConstructor = Found;
17201724 if (ToCanon != FromCanon)
@@ -4062,6 +4066,7 @@ IsUserDefinedConversion(Sema &S, Expr *From, QualType ToType,
40624066 if (isa<InitListExpr>(From)) {
40634067 // Initializer lists don't have conversions as such.
40644068 User.Before.setAsIdentityConversion();
4069+ User.Before.FromBracedInitList = true;
40654070 } else {
40664071 if (Best->Conversions[0].isEllipsis())
40674072 User.EllipsisConversion = true;
@@ -5276,6 +5281,7 @@ TryReferenceInit(Sema &S, Expr *Init, QualType DeclType,
52765281 ICS.Standard.BindsImplicitObjectArgumentWithoutRefQualifier = false;
52775282 ICS.Standard.ObjCLifetimeConversionBinding =
52785283 (RefConv & Sema::ReferenceConversions::ObjCLifetime) != 0;
5284+ ICS.Standard.FromBracedInitList = false;
52795285 ICS.Standard.CopyConstructor = nullptr;
52805286 ICS.Standard.DeprecatedStringLiteralToCharPtr = false;
52815287 };
@@ -5474,6 +5480,7 @@ TryReferenceInit(Sema &S, Expr *Init, QualType DeclType,
54745480 ICS.UserDefined.After.BindsToRvalue = !LValRefType;
54755481 ICS.UserDefined.After.BindsImplicitObjectArgumentWithoutRefQualifier = false;
54765482 ICS.UserDefined.After.ObjCLifetimeConversionBinding = false;
5483+ ICS.UserDefined.After.FromBracedInitList = false;
54775484 }
54785485
54795486 return ICS;
@@ -5760,6 +5767,8 @@ TryListConversion(Sema &S, InitListExpr *From, QualType ToType,
57605767 SCS.BindsToFunctionLvalue = false;
57615768 SCS.BindsImplicitObjectArgumentWithoutRefQualifier = false;
57625769 SCS.ObjCLifetimeConversionBinding = false;
5770+ SCS.FromBracedInitList = false;
5771+
57635772 } else
57645773 Result.setBad(BadConversionSequence::lvalue_ref_to_rvalue,
57655774 From, ToType);
@@ -5777,10 +5786,13 @@ TryListConversion(Sema &S, InitListExpr *From, QualType ToType,
57775786 // single integer.
57785787 unsigned NumInits = From->getNumInits();
57795788 if (NumInits == 1 && !isa<InitListExpr>(From->getInit(0)) &&
5780- !isa<EmbedExpr>(From->getInit(0)))
5789+ !isa<EmbedExpr>(From->getInit(0))) {
57815790 Result = TryCopyInitialization(
57825791 S, From->getInit(0), ToType, SuppressUserConversions,
57835792 InOverloadResolution, AllowObjCWritebackConversion);
5793+ if (Result.isStandard())
5794+ Result.Standard.FromBracedInitList = true;
5795+ }
57845796 // - if the initializer list has no elements, the implicit conversion
57855797 // sequence is the identity conversion.
57865798 else if (NumInits == 0) {
@@ -5993,6 +6005,7 @@ static ImplicitConversionSequence TryObjectArgumentInitialization(
59936005 ICS.Standard.IsLvalueReference = Method->getRefQualifier() != RQ_RValue;
59946006 ICS.Standard.BindsToFunctionLvalue = false;
59956007 ICS.Standard.BindsToRvalue = FromClassification.isRValue();
6008+ ICS.Standard.FromBracedInitList = false;
59966009 ICS.Standard.BindsImplicitObjectArgumentWithoutRefQualifier
59976010 = (Method->getRefQualifier() == RQ_None);
59986011 return ICS;
0 commit comments