<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/61824>61824</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Clang doesn't SFINAE out constrained overload when substitution-failure happens in template-head
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            question,
            c++20,
            clang:frontend,
            rejects-valid,
            concepts
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          cjdb
      </td>
    </tr>
</table>

<pre>
    GCC test `concepts-defarg2.C` fails in Clang. I'm not sure if GCC should be accepting the original lines, but Clang gets suspicious when I uncomment my addition (which I don't think should be failing).
```cpp
// PR c++/97052
// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify %s

template<typename T, typename U = typename T::type>
concept C = true;

constexpr bool f(C auto) {
  return true;
}

// added by me
// constexpr bool f(auto) {
//   return true;
// }

static_assert(f(0));

C auto x = 0;
```
Diagnostics prior to uncommenting:
```
<source>:16:15: error: no matching function for call to 'f'
static_assert(f(0));
              ^
<source>:7:16: note: candidate template ignored: constraints not satisfied [with auto:1 = int]
constexpr bool f(C auto) {
               ^
<source>:4:44: note: because substituted constraint expression is ill-formed: type 'int' cannot be used prior to '::' because it has no members
template<typename T, typename U = typename T::type>
 ^
<source>:4:44: error: type 'int' cannot be used prior to '::' because it has no members
template<typename T, typename U = typename T::type>
 ^
note: in instantiation of default argument for 'C<int>' required here
```
Diagnostics after uncommenting:
```
<source>:4:44: error: type 'int' cannot be used prior to '::' because it has no members
template<typename T, typename U = typename T::type>
                                           ^
note: in instantiation of default argument for 'C<int>' required here
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUVtGPo7YT_mucl1EiYkISHnjIks1P-3L66dp7Phl7AF-Nzdnjvct_XxmSTfa6VbdVVbWIQLDNzDfffINHhKA7i1ix4oEVx4WI1DtfyS-qWTROnav_1TUQBgK2zaSzEkcKS4Wt8B1f1WybQSu0CaAt1EbYbgVPjO8GsI4gRI-gW0g2Qu-iUdAgCJmMaNsB9QjO605bYcBoi4HxGppIsynokAKEGEYttYsBvvVo4QmilW4Y0BIMZxBKadLOAuP7b72WPTyBcpbxHQH12v5y5zkh1bZjvFyx7MiyA9tm8ynH8TLCT4yf4P8fQTL-MJ2ncpcV_NX0x08fWH4AxguZgH6Wcg3LQIrlx8trPINlG86WxPels-YMy2f0uj2nd8LF1nQlHEYjCFle03lEKwaEnxMNL0-fgOVHuJvMDyw_pGeWP85GLomBel7qI7L84d6LdDYQfh89NM4ZaBnf1yAiOcZLYLvLWgCPFL39wcLueG_qQoFQChU0Zxjw1fgbnn7j57L0d9zNkz94DSRIy88iBPTE-D7ZzRgv0_k61Dku-D5Rkd0mr6meH49adNYF0jLA6LXzQO4mrCSS_PDmiyyvg4teTuTnh_U2XYqkBvTe-fTHOhgEyT5JvI1WTvJsnQcpjEl-GN-1jO_eHxm8Oljx-CaW3RVPKj5Mdyms0koQwlVmoDvrPKppNqXKC20pzOUqSIdWowJWPHzT1M8KyQ_riUttiRXHP6end-HepN_mHneDUsSAEGITSFMkVHdoITnGEBKtOoA2Ztk6P8xBpbpIBCe0fJcYSKE1CDGguqU60T_VUVp0dacJehGm_OHQoA9_Y4m-I_oXAf37Y7gmSlvQNpCwpMUkc9dC2hyiIRC-i9NXOkmf8V3N8jpFlD8mvB6_Ru1RQY8e_7BERUvo_0p9_pfYff_xD-VhoapclXkpFlitt_tsnfN1WSz6SpQlb_atLHZFI4v1Wgi1ybLtWvKylRspF7riGc-znJc85_m6WLWF3POiwWStlGrLNhkOQpuVMc_DyvluoUOIWG3Xe75ZGNGgCVNPwvnXiCHFxDhnvGacv2yxt5G0C7P80HpnCa16mfD4BSWF5bMw-jZ67WPSQHFc-CqBWDaxC2yTGR0o3GCRJoPV3I8oh2HuLH46PX04PIKLdPsuoQL3jN44oeZO5eXrpZ1dpt4jtUO9GEe0U790Vc2yR6EW0ZuqJxrDJLm0B3aa-tispBsYPyVAl9ty9C6FxfhpIi0wfpp4-zUAAP__jrT3Mw">