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

    <tr>
        <th>Summary</th>
        <td>
            [clang] Concept can access a private type in a dependent template
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

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

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

<pre>
    This code compiles just fine
```cpp
#include <concepts>

template<typename T>
class trait
{
    using type = int; // note that the type is private
};

template<typename T>
concept has_field = requires(T t) {
    { t.field } -> std::convertible_to<typename trait<T>::type>;
};

struct foo
{
    int field;
};

static_assert(has_field<foo>);
```

https://godbolt.org/z/WKzo7E7cK
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUU0tvtDgQ_DXNpZUR2DDAgUPmwSXXSHuMPHYPOPLYLG5GSn79isck2dV-n_RJvF1d1eUuVIy280QNFAcoTomauA9jE22nHmdyCeajee1tRB0MoQ63wTqK-D5Fxqv1BOkJ0mfYp-uhh2H7IqT12k2GEORRB69p4AjyvC0vV6bb4BQTyCN_DOTVjfD1C6OdihF5VJa3ovKwPiAiTtH6DucyBHlC6xnkAUG0IFr0gQm5V4zc0wqyEYfR3me1jewE8vAH3awWsFfx7WrJmUV2pL8nO1IEUb0ig6jxX01CeUDebfDyhE8gzxjZgHwGOVPeaWR7cfTG4afsaloeF_kFOy8tL4dftR95nDTjNYT_2S3r53GRM78lUGz1m4qRRgZRfTkFeZxZ5RlE_V3zGPlPip55iHPDyxi6YC7B8S6MHYj2E0T718tnKM-lfklMI00ta5VQk5VZmRZVUWZJ32RFVpu9yfNsf9XVfk_G1GVFqZGl2edZndhGpCJPC5mmVS6KbFfURZZlSujaXElJCXlKN2Xdzrn7bdZObIwTNbUsqypx6kIuLpEXQjvlOxBiTv_YzPiny9RFyFNnI8dvBrbslv9krShOeNzioJVHpTXFiOoRsC1wHhUaGsgb8oyPdCXT6Jr_7JPlfrrsdLiBaGfN7fY0jOGdNINoFwsRRLu6uDfinwAAAP__QLEf4g">