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

    <tr>
        <th>Summary</th>
        <td>
            Clang instantiates overload despite failing constraint
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            c++20,
            rejects-valid,
            concepts
      </td>
    </tr>

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

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

<pre>
    This GCC test should be well-formed, but is currently incorrect.
```cpp
// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify %s

template <class T> struct Z {
  typedef typename T::x xx;
};
template <class T> concept C = requires { typename T::A; };
template <C T> typename Z<T>::xx f(void *, T); // #1
template <class T> void f(int, T); // #2
struct A {} a;
struct ZZ {
  template <class T, class = typename Z<T>::xx> operator T *();
  operator int();
};
int main() {
  ZZ zz;
  f(1, a); // OK, deduction fails for #1 because there is no conversion from int to void*
  f(zz, 42); // OK, deduction fails for #1 because C<int> is not satisfied
}
```
Diagnostic issued:
```
<source>:5:20: error: type 'void' cannot be used prior to '::' because it has no members
 typedef typename T::x xx;
                   ^
<source>:12:39: note: in instantiation of template class 'Z<void>' requested here
  template <class T, class = typename Z<T>::xx> operator T *();
 ^
<source>:12:49: note: in instantiation of default argument for 'operator type-parameter-0-0 *<void>' required here
  template <class T, class = typename Z<T>::xx> operator T *();
 ^~~~~~~~~~~~~~
<source>:18:5: note: while substituting deduced template arguments into function template 'operator type-parameter-0-0 *' [with T = void, $1 = (no value)]
  f(zz, 42); // OK, deduction fails for #1 because C<int> is not satisfied
 ^
<source>:18:3: note: while substituting deduced template arguments into function template 'f' [with T = int]
  f(zz, 42); // OK, deduction fails for #1 because C<int> is not satisfied
  ^
```
Note that `struct A` and `T::A` are completely unrelated.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8VkFv6zYM_jXKhUhhS0mcHHJInHaHAW_A0F16GWSZTvQgS5lEp00P--0DbTdN0fa9YcBqFLVDU-T3fSRl6ZTs3iOuxXwr5ruJ7ugQ4tp8r6tJFerz-v5gE_xSlkCYCNIhdK6GCuERnZs2IbZYC1lC1RHYBKaLET25M1hvQoxo6EZkO5FtxCIb_szxOFrknZB38Psf34TagJBz47Tf_2lMDtNEtVA7I-RWyK3MYNqksyf9NA3enWF6wmibM69JY6z-P2F7dJoQhCqN0ynBvVC3kCh2huABRLEdHAHofMQam_7udYvsuRFq8wRPT0KNbqLYXZ4_iW2CN3gkKEGoHUT8q7MRE2d6F3oj1BY-C1kO4S5rHoQq2TKieoJGyOUp2BqE3LDg90Ku-oCDikKq_IdA-7UcxHr6eL0c1o9qbXq1ih3oC94XHd8K-UE6WcLwyJp8SolRhSNGTSHC_cBrOaB6CX553YN-8_JaSOsJWm394HKN7uEBnp-vArIAOePTb-n_9isba6w7QzZ4aLR1CZoQe2GhQqO7hEAHjMh97gNX_oQx9d4xtAwRKPQ6M5WrhM_PHHwm_1PKUqiS2avbIS9B0mRTY7F-FeLthA0_d1bvfUhkDdiUOqxZ948chSpT6KLBoTZzoTYy45HEGEPkBy4hCFkM3Aow2jOQCqFLWMMx2hCZu5DFUFx2eiFgCQ66V6zFtsI4Tuy_m0B4f4n57Ye4cynURq0Yrw-EfLcerE-kPVndaxya134dO1QW3Jc9M3XLuHmGMRHWwMX-ijb_IaPZTxnV2OjOEei471r0NPZQcUnK0KZHHXWLhHGaTbMexTvWNn4t6b-vr48VWI4NeRHg8WAdQuqqRJY6sn4_jBDWr2hfhEg8kwGazg8T9krn5-LIAsR8-2jpwPDVbpzrEoSc5b1ByKUPcNKuQyY2333dyH_eMayX-j_0at4rwhC_lPUV7bc72LdAvDdrArHIXr5fYpGB9jWbLh9gNkUEE9qjQ0J3hs5HZI71zaReq3qlVnqC63yxzHK5LFQxOazlbC6z2crUS5SrvMoLNasW8yxXMjdZsWgmdi0zqTIlV1LKuSpuikotcDlb4qqQZrbSYpZhq627ce7U3oS4n_Q78nqRL_PVxOkKXeoPYFJejjxCSiFLIWXE72goTU_acQeO1vHckdgw303imkNPq26fxCxzNlF6TUaWHK5LPl1d7R6YIJwwuqBrqDEdLWFfGm4RE3yiqK2nSRfd-kB0TP22zgXdWzp01Y0JrZB3nGS8TY8xMFQh73p6Sci7nuE_AQAA__-sWxlN">