[clang] Revert "[Clang] Do not treat Foo -> const Foo conversion sequences as perfect" (PR #149272)

2025-07-17 Thread via cfe-commits

llvmbot wrote:

/pull-request llvm/llvm-project#149328

https://github.com/llvm/llvm-project/pull/149272
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Revert "[Clang] Do not treat Foo -> const Foo conversion sequences as perfect" (PR #149272)

2025-07-17 Thread Corentin Jabot via cfe-commits

cor3ntin wrote:

/cherry-pick 28e1e7e 

https://github.com/llvm/llvm-project/pull/149272
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Revert "[Clang] Do not treat Foo -> const Foo conversion sequences as perfect" (PR #149272)

2025-07-17 Thread Corentin Jabot via cfe-commits

https://github.com/cor3ntin milestoned 
https://github.com/llvm/llvm-project/pull/149272
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Revert "[Clang] Do not treat Foo -> const Foo conversion sequences as perfect" (PR #149272)

2025-07-17 Thread Corentin Jabot via cfe-commits

https://github.com/cor3ntin closed 
https://github.com/llvm/llvm-project/pull/149272
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Revert "[Clang] Do not treat Foo -> const Foo conversion sequences as perfect" (PR #149272)

2025-07-17 Thread Alexander Kornienko via cfe-commits

https://github.com/alexfh approved this pull request.


https://github.com/llvm/llvm-project/pull/149272
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Revert "[Clang] Do not treat Foo -> const Foo conversion sequences as perfect" (PR #149272)

2025-07-17 Thread Younan Zhang via cfe-commits

https://github.com/zyn0217 approved this pull request.


https://github.com/llvm/llvm-project/pull/149272
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Revert "[Clang] Do not treat Foo -> const Foo conversion sequences as perfect" (PR #149272)

2025-07-17 Thread Corentin Jabot via cfe-commits

https://github.com/cor3ntin created 
https://github.com/llvm/llvm-project/pull/149272

Reverts llvm/llvm-project#148613

Considering object argument conversion qualifications perfect leads to 
situations where we prefer a non-template const qualified function over a 
non-qualified template function, which is very wrong indeed. 

I explored solutions to work around that, but instead, we might want to go the 
GCC road and prefer the friend overload in the #147374 example, as this seems a 
lot more consistent and reliable


>From 8a9a1b831888b431771ea65577f588bfdfa56c5a Mon Sep 17 00:00:00 2001
From: Corentin Jabot 
Date: Thu, 17 Jul 2025 10:33:44 +0200
Subject: [PATCH] =?UTF-8?q?Revert=20"[Clang]=20Do=20not=20treat=20Foo=20->?=
 =?UTF-8?q?=20const=20Foo=20conversion=20sequences=20as=20perfect=E2=80=A6?=
 =?UTF-8?q?"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This reverts commit acf07dc77cba07d67c85e120c2eb8094438572e9.
---
 clang/include/clang/Sema/Overload.h   | 11 ++--
 clang/lib/Sema/SemaOverload.cpp   | 14 +-
 ...overload-resolution-deferred-templates.cpp | 28 ---
 3 files changed, 4 insertions(+), 49 deletions(-)

diff --git a/clang/include/clang/Sema/Overload.h 
b/clang/include/clang/Sema/Overload.h
index 9135ff949eeab..a70335bef9dd4 100644
--- a/clang/include/clang/Sema/Overload.h
+++ b/clang/include/clang/Sema/Overload.h
@@ -350,11 +350,6 @@ class Sema;
 LLVM_PREFERRED_TYPE(bool)
 unsigned BindsToRvalue : 1;
 
-/// Whether this was an identity conversion with qualification
-/// conversion for the implicit object argument.
-LLVM_PREFERRED_TYPE(bool)
-unsigned IsImplicitObjectArgumentQualificationConversion : 1;
-
 /// Whether this binds an implicit object argument to a
 /// non-static member function without a ref-qualifier.
 LLVM_PREFERRED_TYPE(bool)
@@ -453,11 +448,11 @@ class Sema;
 #endif
 return true;
   }
+  if (!C.hasSameType(getFromType(), getToType(2)))
+return false;
   if (BindsToRvalue && IsLvalueReference)
 return false;
-  if (IsImplicitObjectArgumentQualificationConversion)
-return C.hasSameUnqualifiedType(getFromType(), getToType(2));
-  return C.hasSameType(getFromType(), getToType(2));
+  return true;
 }
 
 ImplicitConversionRank getRank() const;
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index f3baf0c3ef3bc..1b54628c5e564 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -245,7 +245,6 @@ void StandardConversionSequence::setAsIdentityConversion() {
   IsLvalueReference = true;
   BindsToFunctionLvalue = false;
   BindsToRvalue = false;
-  IsImplicitObjectArgumentQualificationConversion = false;
   BindsImplicitObjectArgumentWithoutRefQualifier = false;
   ObjCLifetimeConversionBinding = false;
   FromBracedInitList = false;
@@ -5318,7 +5317,6 @@ TryReferenceInit(Sema &S, Expr *Init, QualType DeclType,
 ICS.Standard.DirectBinding = BindsDirectly;
 ICS.Standard.IsLvalueReference = !isRValRef;
 ICS.Standard.BindsToFunctionLvalue = T2->isFunctionType();
-ICS.Standard.IsImplicitObjectArgumentQualificationConversion = false;
 ICS.Standard.BindsToRvalue = InitCategory.isRValue();
 ICS.Standard.BindsImplicitObjectArgumentWithoutRefQualifier = false;
 ICS.Standard.ObjCLifetimeConversionBinding =
@@ -5498,7 +5496,6 @@ TryReferenceInit(Sema &S, Expr *Init, QualType DeclType,
 ICS.Standard.IsLvalueReference = !isRValRef;
 ICS.Standard.BindsToFunctionLvalue = false;
 ICS.Standard.BindsToRvalue = true;
-ICS.Standard.IsImplicitObjectArgumentQualificationConversion = false;
 ICS.Standard.BindsImplicitObjectArgumentWithoutRefQualifier = false;
 ICS.Standard.ObjCLifetimeConversionBinding = false;
   } else if (ICS.isUserDefined()) {
@@ -5521,8 +5518,6 @@ TryReferenceInit(Sema &S, Expr *Init, QualType DeclType,
 ICS.UserDefined.After.IsLvalueReference = !isRValRef;
 ICS.UserDefined.After.BindsToFunctionLvalue = false;
 ICS.UserDefined.After.BindsToRvalue = !LValRefType;
-ICS.UserDefined.After.IsImplicitObjectArgumentQualificationConversion =
-false;
 ICS.UserDefined.After.BindsImplicitObjectArgumentWithoutRefQualifier = 
false;
 ICS.UserDefined.After.ObjCLifetimeConversionBinding = false;
 ICS.UserDefined.After.FromBracedInitList = false;
@@ -5807,7 +5802,6 @@ TryListConversion(Sema &S, InitListExpr *From, QualType 
ToType,
   StandardConversionSequence &SCS = Result.isStandard() ? Result.Standard :
 Result.UserDefined.After;
   SCS.ReferenceBinding = true;
-  SCS.IsImplicitObjectArgumentQualificationConversion = false;
   SCS.IsLvalueReference = ToType->isLValueReferenceType();
   SCS.BindsToRvalue = true;
   SCS.BindsToFunctionLvalue = false;
@@ -6005,12 +5999,8 @@ static ImplicitC

[clang] Revert "[Clang] Do not treat Foo -> const Foo conversion sequences as perfect" (PR #149272)

2025-07-17 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-clang

Author: Corentin Jabot (cor3ntin)


Changes

Reverts llvm/llvm-project#148613

Considering object argument conversion qualifications perfect leads to 
situations where we prefer a non-template const qualified function over a 
non-qualified template function, which is very wrong indeed. 

I explored solutions to work around that, but instead, we might want to go the 
GCC road and prefer the friend overload in the #147374 example, as this 
seems a lot more consistent and reliable


---
Full diff: https://github.com/llvm/llvm-project/pull/149272.diff


3 Files Affected:

- (modified) clang/include/clang/Sema/Overload.h (+3-8) 
- (modified) clang/lib/Sema/SemaOverload.cpp (+1-13) 
- (modified) clang/test/SemaCXX/overload-resolution-deferred-templates.cpp 
(-28) 


``diff
diff --git a/clang/include/clang/Sema/Overload.h 
b/clang/include/clang/Sema/Overload.h
index 9135ff949eeab..a70335bef9dd4 100644
--- a/clang/include/clang/Sema/Overload.h
+++ b/clang/include/clang/Sema/Overload.h
@@ -350,11 +350,6 @@ class Sema;
 LLVM_PREFERRED_TYPE(bool)
 unsigned BindsToRvalue : 1;
 
-/// Whether this was an identity conversion with qualification
-/// conversion for the implicit object argument.
-LLVM_PREFERRED_TYPE(bool)
-unsigned IsImplicitObjectArgumentQualificationConversion : 1;
-
 /// Whether this binds an implicit object argument to a
 /// non-static member function without a ref-qualifier.
 LLVM_PREFERRED_TYPE(bool)
@@ -453,11 +448,11 @@ class Sema;
 #endif
 return true;
   }
+  if (!C.hasSameType(getFromType(), getToType(2)))
+return false;
   if (BindsToRvalue && IsLvalueReference)
 return false;
-  if (IsImplicitObjectArgumentQualificationConversion)
-return C.hasSameUnqualifiedType(getFromType(), getToType(2));
-  return C.hasSameType(getFromType(), getToType(2));
+  return true;
 }
 
 ImplicitConversionRank getRank() const;
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index f3baf0c3ef3bc..1b54628c5e564 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -245,7 +245,6 @@ void StandardConversionSequence::setAsIdentityConversion() {
   IsLvalueReference = true;
   BindsToFunctionLvalue = false;
   BindsToRvalue = false;
-  IsImplicitObjectArgumentQualificationConversion = false;
   BindsImplicitObjectArgumentWithoutRefQualifier = false;
   ObjCLifetimeConversionBinding = false;
   FromBracedInitList = false;
@@ -5318,7 +5317,6 @@ TryReferenceInit(Sema &S, Expr *Init, QualType DeclType,
 ICS.Standard.DirectBinding = BindsDirectly;
 ICS.Standard.IsLvalueReference = !isRValRef;
 ICS.Standard.BindsToFunctionLvalue = T2->isFunctionType();
-ICS.Standard.IsImplicitObjectArgumentQualificationConversion = false;
 ICS.Standard.BindsToRvalue = InitCategory.isRValue();
 ICS.Standard.BindsImplicitObjectArgumentWithoutRefQualifier = false;
 ICS.Standard.ObjCLifetimeConversionBinding =
@@ -5498,7 +5496,6 @@ TryReferenceInit(Sema &S, Expr *Init, QualType DeclType,
 ICS.Standard.IsLvalueReference = !isRValRef;
 ICS.Standard.BindsToFunctionLvalue = false;
 ICS.Standard.BindsToRvalue = true;
-ICS.Standard.IsImplicitObjectArgumentQualificationConversion = false;
 ICS.Standard.BindsImplicitObjectArgumentWithoutRefQualifier = false;
 ICS.Standard.ObjCLifetimeConversionBinding = false;
   } else if (ICS.isUserDefined()) {
@@ -5521,8 +5518,6 @@ TryReferenceInit(Sema &S, Expr *Init, QualType DeclType,
 ICS.UserDefined.After.IsLvalueReference = !isRValRef;
 ICS.UserDefined.After.BindsToFunctionLvalue = false;
 ICS.UserDefined.After.BindsToRvalue = !LValRefType;
-ICS.UserDefined.After.IsImplicitObjectArgumentQualificationConversion =
-false;
 ICS.UserDefined.After.BindsImplicitObjectArgumentWithoutRefQualifier = 
false;
 ICS.UserDefined.After.ObjCLifetimeConversionBinding = false;
 ICS.UserDefined.After.FromBracedInitList = false;
@@ -5807,7 +5802,6 @@ TryListConversion(Sema &S, InitListExpr *From, QualType 
ToType,
   StandardConversionSequence &SCS = Result.isStandard() ? Result.Standard :
 Result.UserDefined.After;
   SCS.ReferenceBinding = true;
-  SCS.IsImplicitObjectArgumentQualificationConversion = false;
   SCS.IsLvalueReference = ToType->isLValueReferenceType();
   SCS.BindsToRvalue = true;
   SCS.BindsToFunctionLvalue = false;
@@ -6005,12 +5999,8 @@ static ImplicitConversionSequence 
TryObjectArgumentInitialization(
   // affects the conversion rank.
   QualType ClassTypeCanon = S.Context.getCanonicalType(ClassType);
   ImplicitConversionKind SecondKind;
-  bool IsQualificationConversion = false;
-  if (ImplicitParamType.getCanonicalType() == FromTypeCanon) {
+  if (ClassTypeCanon == FromTypeCanon.getLocalUnqualifiedType()) {
 SecondKind = ICK_Identity;