<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">