[clang] [Clang][WIP][RFC] Bypass TAD during overload resolution if a perfect match exists (PR #133426)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Mar 28 04:16:17 PDT 2025
================
@@ -10918,7 +11083,44 @@ bool OverloadCandidate::NotValidBecauseConstraintExprHasError() const {
OverloadingResult
OverloadCandidateSet::BestViableFunction(Sema &S, SourceLocation Loc,
iterator &Best) {
+
+ bool TwoPhaseResolution =
+ !NonDeducedCandidates.empty() && Kind != CSK_CodeCompletion &&
+ Kind != CSK_InitByUserDefinedConversion && Kind != CSK_InitByConstructor;
+
+ if (TwoPhaseResolution) {
+ Best = end();
+ for (auto It = begin(); It != end(); ++It) {
+ if (It->isPerfectMatch(S.getASTContext())) {
+ if (Best == end()) {
+ Best = It;
+ } else {
+ Best = end();
+ break;
+ }
+ }
+ }
+ if (Best != end()) {
+ Best->Best = true;
+ if (Best->Function && Best->Function->isDeleted())
+ return OR_Deleted;
+ if (auto *M = dyn_cast_or_null<CXXMethodDecl>(Best->Function);
+ Kind == CSK_AddressOfOverloadSet && M &&
+ M->isImplicitObjectMemberFunction()) {
+ return OR_No_Viable_Function;
+ }
+ return OR_Success;
+ }
+ }
+ InjectNonDeducedTemplateCandidates(S);
+ return BestViableFunctionImpl(S, Loc, Best);
+}
+
+OverloadingResult OverloadCandidateSet::BestViableFunctionImpl(
+ Sema &S, SourceLocation Loc, OverloadCandidateSet::iterator &Best) {
+
----------------
cor3ntin wrote:
This is the meat of the change (that and the definition of `isPerfectMatch`)
https://github.com/llvm/llvm-project/pull/133426
More information about the cfe-commits
mailing list