@@ -245,6 +245,7 @@ void StandardConversionSequence::setAsIdentityConversion() {
245245 IsLvalueReference = true;
246246 BindsToFunctionLvalue = false;
247247 BindsToRvalue = false;
248+  IsImplicitObjectArgumentQualificationConversion = false;
248249 BindsImplicitObjectArgumentWithoutRefQualifier = false;
249250 ObjCLifetimeConversionBinding = false;
250251 FromBracedInitList = false;
@@ -5317,6 +5318,7 @@ TryReferenceInit(Sema &S, Expr *Init, QualType DeclType,
53175318 ICS.Standard.DirectBinding = BindsDirectly;
53185319 ICS.Standard.IsLvalueReference = !isRValRef;
53195320 ICS.Standard.BindsToFunctionLvalue = T2->isFunctionType();
5321+  ICS.Standard.IsImplicitObjectArgumentQualificationConversion = false;
53205322 ICS.Standard.BindsToRvalue = InitCategory.isRValue();
53215323 ICS.Standard.BindsImplicitObjectArgumentWithoutRefQualifier = false;
53225324 ICS.Standard.ObjCLifetimeConversionBinding =
@@ -5496,6 +5498,7 @@ TryReferenceInit(Sema &S, Expr *Init, QualType DeclType,
54965498 ICS.Standard.IsLvalueReference = !isRValRef;
54975499 ICS.Standard.BindsToFunctionLvalue = false;
54985500 ICS.Standard.BindsToRvalue = true;
5501+  ICS.Standard.IsImplicitObjectArgumentQualificationConversion = false;
54995502 ICS.Standard.BindsImplicitObjectArgumentWithoutRefQualifier = false;
55005503 ICS.Standard.ObjCLifetimeConversionBinding = false;
55015504 } else if (ICS.isUserDefined()) {
@@ -5518,6 +5521,8 @@ TryReferenceInit(Sema &S, Expr *Init, QualType DeclType,
55185521 ICS.UserDefined.After.IsLvalueReference = !isRValRef;
55195522 ICS.UserDefined.After.BindsToFunctionLvalue = false;
55205523 ICS.UserDefined.After.BindsToRvalue = !LValRefType;
5524+  ICS.UserDefined.After.IsImplicitObjectArgumentQualificationConversion =
5525+  false;
55215526 ICS.UserDefined.After.BindsImplicitObjectArgumentWithoutRefQualifier = false;
55225527 ICS.UserDefined.After.ObjCLifetimeConversionBinding = false;
55235528 ICS.UserDefined.After.FromBracedInitList = false;
@@ -5802,6 +5807,7 @@ TryListConversion(Sema &S, InitListExpr *From, QualType ToType,
58025807 StandardConversionSequence &SCS = Result.isStandard() ? Result.Standard :
58035808 Result.UserDefined.After;
58045809 SCS.ReferenceBinding = true;
5810+  SCS.IsImplicitObjectArgumentQualificationConversion = false;
58055811 SCS.IsLvalueReference = ToType->isLValueReferenceType();
58065812 SCS.BindsToRvalue = true;
58075813 SCS.BindsToFunctionLvalue = false;
@@ -5999,8 +6005,12 @@ static ImplicitConversionSequence TryObjectArgumentInitialization(
59996005 // affects the conversion rank.
60006006 QualType ClassTypeCanon = S.Context.getCanonicalType(ClassType);
60016007 ImplicitConversionKind SecondKind;
6002-  if (ClassTypeCanon == FromTypeCanon.getLocalUnqualifiedType()) {
6008+  bool IsQualificationConversion = false;
6009+  if (ImplicitParamType.getCanonicalType() == FromTypeCanon) {
60036010 SecondKind = ICK_Identity;
6011+  } else if (ClassTypeCanon == FromTypeCanon.getLocalUnqualifiedType()) {
6012+  SecondKind = ICK_Identity;
6013+  IsQualificationConversion = true;
60046014 } else if (S.IsDerivedFrom(Loc, FromType, ClassType)) {
60056015 SecondKind = ICK_Derived_To_Base;
60066016 } else if (!Method->isExplicitObjectMemberFunction()) {
@@ -6041,6 +6051,8 @@ static ImplicitConversionSequence TryObjectArgumentInitialization(
60416051 ICS.Standard.setFromType(FromType);
60426052 ICS.Standard.setAllToTypes(ImplicitParamType);
60436053 ICS.Standard.ReferenceBinding = true;
6054+  ICS.Standard.IsImplicitObjectArgumentQualificationConversion =
6055+  IsQualificationConversion;
60446056 ICS.Standard.DirectBinding = true;
60456057 ICS.Standard.IsLvalueReference = Method->getRefQualifier() != RQ_RValue;
60466058 ICS.Standard.BindsToFunctionLvalue = false;
0 commit comments