[all-commits] [llvm/llvm-project] 8c5a30: [Clang] Bypass TAD during overload resolution if a...

cor3ntin via All-commits all-commits at lists.llvm.org
Thu Apr 17 21:11:19 PDT 2025


  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: 8c5a307bd8d406e6167a5cd3ce3c74e2e3bfb2a6
      https://github.com/llvm/llvm-project/commit/8c5a307bd8d406e6167a5cd3ce3c74e2e3bfb2a6
  Author: cor3ntin <corentinjabot at gmail.com>
  Date:   2025-04-18 (Fri, 18 Apr 2025)

  Changed paths:
    M clang/docs/ReleaseNotes.rst
    M clang/include/clang/Sema/Overload.h
    M clang/lib/Sema/SemaCodeComplete.cpp
    M clang/lib/Sema/SemaInit.cpp
    M clang/lib/Sema/SemaOverload.cpp
    M clang/lib/Sema/SemaTemplateDeduction.cpp
    M clang/test/CXX/temp/temp.constr/temp.constr.atomic/constrant-satisfaction-conversions.cpp
    M clang/test/SemaCUDA/function-overload.cu
    M clang/test/SemaCXX/implicit-member-functions.cpp
    A clang/test/SemaCXX/overload-resolution-deferred-templates.cpp
    M clang/test/SemaTemplate/instantiate-function-params.cpp
    M clang/test/Templight/templight-empty-entries-fix.cpp

  Log Message:
  -----------
  [Clang] Bypass TAD during overload resolution if a perfect match exists (#136203)

This implements the same overload resolution behavior as GCC,
as described in https://wg21.link/p3606 (section 1-2, not 3)

If during overload resolution, there is a non-template candidate
that would be always be picked - because each of the argument
is a perfect match (ie the source and target types are the same),
we do not perform deduction for any template candidate
that might exists.

The goal is to be able to merge
https://github.com/llvm/llvm-project/pull/122423 without being too
disruptive.

This change means that the selection of the best viable candidate and
template argument deduction become interleaved.

To avoid rewriting half of Clang we store in OverloadCandidateSet
enough information to be able to deduce template candidates from
OverloadCandidateSet::BestViableFunction. Which means
the lifetime of any object used by template argument must outlive
a call to Add*Template*Candidate.

This two phase resolution is not performed for some initialization
as there are cases where template candidate are better match
in these cases per the standard. It's also bypassed for code completion.

The change has a nice impact on compile times

https://llvm-compile-time-tracker.com/compare.php?from=719b029c16eeb1035da522fd641dfcc4cee6be74&to=bf7041045c9408490c395230047c5461de72fc39&stat=instructions%3Au

Fixes https://github.com/llvm/llvm-project/issues/62096
Fixes https://github.com/llvm/llvm-project/issues/74581

Reapplies https://github.com/llvm/llvm-project/pull/133426



To unsubscribe from these emails, change your notification settings at https://github.com/llvm/llvm-project/settings/notifications


More information about the All-commits mailing list